├── litemall ├── deploy │ ├── db │ │ └── .gitkeep │ ├── .gitignore │ ├── bin │ │ ├── stop.sh │ │ ├── deploy.sh │ │ └── reset.sh │ └── util │ │ ├── package.sh │ │ └── lazy.sh ├── docker │ ├── db │ │ ├── data │ │ │ └── .gitkeep │ │ ├── init-sql │ │ │ └── .gitkeep │ │ └── conf.d │ │ │ └── my.cnf │ ├── litemall │ │ ├── .gitkeep │ │ └── Dockerfile │ ├── .gitignore │ ├── bin │ │ ├── deploy.sh │ │ └── reset.sh │ ├── docker-compose.yml │ └── util │ │ ├── package.sh │ │ └── lazy.sh ├── .gitbook.yaml ├── litemall-wx-api │ ├── src │ │ ├── main │ │ │ ├── resources │ │ │ │ ├── application-wx.yml │ │ │ │ └── application.yml │ │ │ └── java │ │ │ │ └── org │ │ │ │ └── linlinjava │ │ │ │ └── litemall │ │ │ │ └── wx │ │ │ │ ├── annotation │ │ │ │ └── LoginUser.java │ │ │ │ ├── dto │ │ │ │ ├── WxLoginInfo.java │ │ │ │ ├── CaptchaItem.java │ │ │ │ └── UserToken.java │ │ │ │ ├── service │ │ │ │ ├── UserTokenManager.java │ │ │ │ ├── UserInfoService.java │ │ │ │ └── GetRegionService.java │ │ │ │ ├── config │ │ │ │ └── WxWebMvcConfiguration.java │ │ │ │ ├── Application.java │ │ │ │ └── web │ │ │ │ └── WxIndexController.java │ │ └── test │ │ │ └── java │ │ │ └── org │ │ │ └── linlinjava │ │ │ └── litemall │ │ │ └── wx │ │ │ ├── BigDecimalTest.java │ │ │ └── WxConfigTest.java │ └── .gitignore ├── litemall-admin-api │ ├── src │ │ ├── main │ │ │ ├── resources │ │ │ │ ├── application-admin.yml │ │ │ │ └── application.yml │ │ │ └── java │ │ │ │ └── org │ │ │ │ └── linlinjava │ │ │ │ └── litemall │ │ │ │ └── admin │ │ │ │ ├── annotation │ │ │ │ └── RequiresPermissionsDesc.java │ │ │ │ ├── vo │ │ │ │ ├── CatVo.java │ │ │ │ ├── StatVo.java │ │ │ │ ├── PermVo.java │ │ │ │ └── RegionVo.java │ │ │ │ ├── Application.java │ │ │ │ ├── util │ │ │ │ └── Permission.java │ │ │ │ ├── config │ │ │ │ ├── KaptchaConfig.java │ │ │ │ └── ShiroExceptionHandler.java │ │ │ │ └── dto │ │ │ │ └── GoodsAllinone.java │ │ └── test │ │ │ └── java │ │ │ └── org │ │ │ └── linlinjava │ │ │ └── litemall │ │ │ └── admin │ │ │ ├── BcryptTest.java │ │ │ ├── CreateShareImageTest.java │ │ │ ├── AdminConfigTest.java │ │ │ └── PermissionTest.java │ └── .gitignore ├── litemall-all │ ├── .gitignore │ └── src │ │ └── main │ │ ├── resources │ │ └── application.yml │ │ └── java │ │ └── org │ │ └── linlinjava │ │ └── litemall │ │ └── Application.java ├── litemall-db │ ├── .gitignore │ ├── src │ │ ├── main │ │ │ ├── resources │ │ │ │ ├── application.yml │ │ │ │ ├── org │ │ │ │ │ └── linlinjava │ │ │ │ │ │ └── litemall │ │ │ │ │ │ └── db │ │ │ │ │ │ └── dao │ │ │ │ │ │ ├── GoodsProductMapper.xml │ │ │ │ │ │ └── StatMapper.xml │ │ │ │ └── application-db.yml │ │ │ └── java │ │ │ │ └── org │ │ │ │ └── linlinjava │ │ │ │ └── litemall │ │ │ │ └── db │ │ │ │ ├── dao │ │ │ │ ├── StatMapper.java │ │ │ │ ├── GoodsProductMapper.java │ │ │ │ └── OrderMapper.java │ │ │ │ ├── util │ │ │ │ ├── CouponUserConstant.java │ │ │ │ ├── GrouponConstant.java │ │ │ │ ├── AftersaleConstant.java │ │ │ │ └── CouponConstant.java │ │ │ │ ├── domain │ │ │ │ └── UserVo.java │ │ │ │ └── service │ │ │ │ └── StatService.java │ │ └── test │ │ │ └── java │ │ │ └── org │ │ │ └── linlinjava │ │ │ └── litemall │ │ │ └── db │ │ │ ├── Application.java │ │ │ ├── DbTest.java │ │ │ ├── DbUtilTest.java │ │ │ ├── DbConfigTest.java │ │ │ ├── StockTest.java │ │ │ └── MapperReturnTest.java │ └── sql │ │ ├── litemall_schema.sql │ │ └── README.md ├── litemall-all-war │ ├── .gitignore │ └── src │ │ └── main │ │ ├── resources │ │ └── application.yml │ │ └── java │ │ └── org │ │ └── linlinjava │ │ └── litemall │ │ └── Application.java ├── litemall-core │ ├── .gitignore │ └── src │ │ ├── main │ │ ├── resources │ │ │ ├── back.png │ │ │ ├── back_groupon.png │ │ │ └── application.yml │ │ └── java │ │ │ └── org │ │ │ └── linlinjava │ │ │ └── litemall │ │ │ └── core │ │ │ ├── config │ │ │ ├── AsyncConfig.java │ │ │ ├── ValidatorConfiguration.java │ │ │ └── CorsConfig.java │ │ │ ├── notify │ │ │ ├── NotifyType.java │ │ │ ├── SmsSender.java │ │ │ └── SmsResult.java │ │ │ ├── util │ │ │ ├── DateTimeUtil.java │ │ │ ├── BeanUtil.java │ │ │ └── CharUtil.java │ │ │ ├── validator │ │ │ ├── Order.java │ │ │ ├── Sort.java │ │ │ ├── SortValidator.java │ │ │ └── OrderValidator.java │ │ │ ├── storage │ │ │ └── Storage.java │ │ │ ├── express │ │ │ ├── config │ │ │ │ ├── ExpressAutoConfiguration.java │ │ │ │ └── ExpressProperties.java │ │ │ └── dao │ │ │ │ └── Traces.java │ │ │ └── task │ │ │ ├── TaskService.java │ │ │ └── Task.java │ │ └── test │ │ ├── resources │ │ └── litemall.png │ │ └── java │ │ └── org │ │ └── linlinjava │ │ └── litemall │ │ └── core │ │ ├── IntegerTest.java │ │ ├── Application.java │ │ ├── AsyncTask.java │ │ ├── AsyncTest.java │ │ ├── CoreConfigTest.java │ │ └── ExpressTest.java ├── doc │ ├── unused │ │ ├── 3.png │ │ ├── 5.gif │ │ ├── qq.png │ │ ├── qq2.png │ │ ├── litemall.ico │ │ └── litemall.png │ ├── pics │ │ ├── admin │ │ │ ├── get.png │ │ │ ├── login.png │ │ │ ├── get_no_token.png │ │ │ ├── get_with_token.png │ │ │ ├── post_no_token.png │ │ │ └── post_with_token.png │ │ ├── readme │ │ │ ├── qq3.png │ │ │ ├── mobmall.png │ │ │ ├── admin-dashboard.png │ │ │ ├── renard_wx_demo.png │ │ │ ├── litemall_wx_demo.png │ │ │ ├── project-structure.png │ │ │ └── technology-stack.png │ │ ├── faq │ │ │ └── excluded.png │ │ ├── database │ │ │ ├── admin.png │ │ │ ├── goods.png │ │ │ ├── order.png │ │ │ ├── others.png │ │ │ ├── user.png │ │ │ └── order-status.png │ │ ├── project │ │ │ ├── stage.png │ │ │ ├── idea-run-all.png │ │ │ ├── yml-resource.png │ │ │ ├── deploy-single.png │ │ │ ├── develop-stage.png │ │ │ ├── maven-profile.png │ │ │ ├── online-deploy.png │ │ │ ├── security-group.png │ │ │ ├── spring-profile.png │ │ │ ├── project-structure.png │ │ │ └── idea-maven-insatll.png │ │ └── platform │ │ │ ├── db-main.png │ │ │ └── mybatis-generator.png │ ├── note.md │ ├── README.md │ ├── performance.md │ └── mobmall.md ├── .gitignore └── LICENSE ├── pcvue ├── src │ ├── assets │ │ ├── variables.css │ │ ├── logo.png │ │ ├── default_pic.png │ │ └── default_avatar.jpg │ ├── plugins │ │ ├── element.js │ │ ├── vueamap.js │ │ ├── local-storage.js │ │ ├── vue.config.js │ │ └── function.js │ ├── views │ │ ├── index.vue │ │ └── Home │ │ │ └── store │ │ │ ├── index.vue │ │ │ └── store_goods_list.vue │ ├── App.vue │ ├── store.js │ └── components │ │ ├── home │ │ └── public │ │ │ ├── shop_index_adv.vue │ │ │ └── banner.vue │ │ └── admin │ │ └── BreadcrumbNav.vue ├── babel.config.js ├── public │ ├── favicon.ico │ ├── pc │ │ ├── 001.png │ │ ├── 002.png │ │ ├── 003.png │ │ ├── 004.png │ │ ├── 005.png │ │ ├── 006.png │ │ ├── logo.png │ │ ├── user.png │ │ ├── adv001.jpg │ │ ├── pc_alipay.jpg │ │ ├── pc_wxpay.jpg │ │ ├── address_pos.jpg │ │ ├── cart_empty.png │ │ ├── integral_01.png │ │ ├── integral_02.png │ │ ├── integral_03.png │ │ ├── summary-bg.jpg │ │ ├── default_avatar.png │ │ ├── default_store_adv.jpg │ │ ├── loading_pic_200.png │ │ ├── loading_pic_400.png │ │ └── not-common-icon.png │ ├── login │ │ ├── bg.png │ │ └── login_bg.png │ ├── music │ │ └── chat.wav │ ├── fonts │ │ ├── iconfont.eot │ │ ├── iconfont.ttf │ │ ├── iconfont.woff │ │ └── iconfont.woff2 │ └── index.html └── .gitignore ├── litemall-admin ├── .eslintignore ├── babel.config.js ├── postcss.config.js ├── public │ ├── favicon.ico │ ├── tinymce4.7.5 │ │ ├── skins │ │ │ └── lightgray │ │ │ │ ├── img │ │ │ │ ├── trans.gif │ │ │ │ ├── anchor.gif │ │ │ │ ├── loader.gif │ │ │ │ └── object.gif │ │ │ │ └── fonts │ │ │ │ ├── tinymce.eot │ │ │ │ ├── tinymce.ttf │ │ │ │ ├── tinymce.woff │ │ │ │ ├── tinymce-small.eot │ │ │ │ ├── tinymce-small.ttf │ │ │ │ ├── tinymce-mobile.woff │ │ │ │ └── tinymce-small.woff │ │ └── plugins │ │ │ └── emoticons │ │ │ └── img │ │ │ ├── smiley-cool.gif │ │ │ ├── smiley-cry.gif │ │ │ ├── smiley-kiss.gif │ │ │ ├── smiley-wink.gif │ │ │ ├── smiley-yell.gif │ │ │ ├── smiley-frown.gif │ │ │ ├── smiley-sealed.gif │ │ │ ├── smiley-smile.gif │ │ │ ├── smiley-innocent.gif │ │ │ ├── smiley-laughing.gif │ │ │ ├── smiley-surprised.gif │ │ │ ├── smiley-undecided.gif │ │ │ ├── smiley-embarassed.gif │ │ │ ├── smiley-money-mouth.gif │ │ │ ├── smiley-tongue-out.gif │ │ │ └── smiley-foot-in-mouth.gif │ └── index.html ├── src │ ├── assets │ │ ├── 401_images │ │ │ └── 401.gif │ │ └── 404_images │ │ │ ├── 404.png │ │ │ └── 404_cloud.png │ ├── App.vue │ ├── icons │ │ ├── svg │ │ │ ├── chart.svg │ │ │ ├── size.svg │ │ │ ├── link.svg │ │ │ ├── guide.svg │ │ │ ├── component.svg │ │ │ ├── money.svg │ │ │ ├── drag.svg │ │ │ ├── email.svg │ │ │ ├── guide 2.svg │ │ │ ├── documentation.svg │ │ │ ├── user.svg │ │ │ ├── lock.svg │ │ │ ├── excel.svg │ │ │ ├── example.svg │ │ │ ├── star.svg │ │ │ ├── table.svg │ │ │ ├── password.svg │ │ │ ├── tab.svg │ │ │ ├── message.svg │ │ │ ├── theme.svg │ │ │ ├── peoples.svg │ │ │ ├── edit.svg │ │ │ ├── nested.svg │ │ │ ├── eye.svg │ │ │ ├── clipboard.svg │ │ │ ├── list.svg │ │ │ ├── icon.svg │ │ │ ├── international.svg │ │ │ ├── wechat.svg │ │ │ ├── people.svg │ │ │ ├── language.svg │ │ │ ├── 404.svg │ │ │ └── zip.svg │ │ ├── index.js │ │ └── svgo.yml │ ├── api │ │ ├── log.js │ │ ├── dashboard.js │ │ ├── region.js │ │ ├── comment.js │ │ ├── stat.js │ │ ├── login.js │ │ ├── ad.js │ │ ├── brand.js │ │ ├── issue.js │ │ ├── admin.js │ │ ├── keyword.js │ │ ├── groupon.js │ │ ├── storage.js │ │ ├── goods.js │ │ ├── category.js │ │ ├── topic.js │ │ ├── coupon.js │ │ ├── notice.js │ │ ├── aftersale.js │ │ ├── profile.js │ │ ├── config.js │ │ ├── role.js │ │ ├── user.js │ │ └── order.js │ ├── views │ │ ├── layout │ │ │ ├── components │ │ │ │ ├── index.js │ │ │ │ ├── Sidebar │ │ │ │ │ ├── FixiOSBug.js │ │ │ │ │ ├── Link.vue │ │ │ │ │ ├── Item.vue │ │ │ │ │ └── index.vue │ │ │ │ └── AppMain.vue │ │ │ └── mixin │ │ │ │ └── ResizeHandler.js │ │ ├── login │ │ │ └── authredirect.vue │ │ ├── redirect │ │ │ └── index.vue │ │ ├── stat │ │ │ ├── goods.vue │ │ │ ├── order.vue │ │ │ └── user.vue │ │ └── mall │ │ │ └── region.vue │ ├── directive │ │ ├── clipboard │ │ │ └── index.js │ │ └── permission │ │ │ ├── index.js │ │ │ └── permission.js │ ├── utils │ │ ├── auth.js │ │ ├── permission.js │ │ ├── clipboard.js │ │ └── openWindow.js │ ├── store │ │ ├── index.js │ │ └── getters.js │ ├── styles │ │ ├── variables.scss │ │ ├── element-variables.scss │ │ ├── transition.scss │ │ └── element-ui.scss │ ├── components │ │ ├── Screenfull │ │ │ └── index.vue │ │ └── Notice │ │ │ └── index.vue │ └── main.js ├── .env.deployment ├── .env.production ├── jsconfig.json ├── .editorconfig ├── .gitignore ├── .env.development └── jest.config.js └── README.md /litemall/deploy/db/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /litemall/docker/db/data/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /litemall/docker/litemall/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /pcvue/src/assets/variables.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /litemall/docker/db/init-sql/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /litemall/.gitbook.yaml: -------------------------------------------------------------------------------- 1 | structure: 2 | summary: doc/README.md -------------------------------------------------------------------------------- /litemall/litemall-wx-api/src/main/resources/application-wx.yml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /litemall/litemall-admin-api/src/main/resources/application-admin.yml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /litemall/litemall-all/.gitignore: -------------------------------------------------------------------------------- 1 | 2 | /target/ 3 | /litemall-all.iml 4 | -------------------------------------------------------------------------------- /litemall/litemall-db/.gitignore: -------------------------------------------------------------------------------- 1 | 2 | /target/ 3 | /litemall-db.iml 4 | -------------------------------------------------------------------------------- /litemall-admin/.eslintignore: -------------------------------------------------------------------------------- 1 | build/*.js 2 | src/assets 3 | public 4 | dist 5 | -------------------------------------------------------------------------------- /litemall/litemall-wx-api/.gitignore: -------------------------------------------------------------------------------- 1 | 2 | /target/ 3 | /litemall-wx-api.iml 4 | -------------------------------------------------------------------------------- /litemall/deploy/.gitignore: -------------------------------------------------------------------------------- 1 | 2 | /db/litemall.sql 3 | /litemall/litemall.jar 4 | -------------------------------------------------------------------------------- /litemall/litemall-all-war/.gitignore: -------------------------------------------------------------------------------- 1 | 2 | /target/ 3 | /litemall-all-war.iml 4 | -------------------------------------------------------------------------------- /litemall/docker/.gitignore: -------------------------------------------------------------------------------- 1 | 2 | /litemall/litemall.jar 3 | /db/init-sql/litemall.sql 4 | -------------------------------------------------------------------------------- /litemall/litemall-admin-api/.gitignore: -------------------------------------------------------------------------------- 1 | 2 | /target/ 3 | /litemall-admin-api.iml 4 | -------------------------------------------------------------------------------- /litemall/litemall-core/.gitignore: -------------------------------------------------------------------------------- 1 | 2 | /target/ 3 | /litemall-core.iml 4 | /storage/ 5 | -------------------------------------------------------------------------------- /pcvue/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | '@vue/app' 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /pcvue/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/pcvue/public/favicon.ico -------------------------------------------------------------------------------- /pcvue/public/pc/001.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/pcvue/public/pc/001.png -------------------------------------------------------------------------------- /pcvue/public/pc/002.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/pcvue/public/pc/002.png -------------------------------------------------------------------------------- /pcvue/public/pc/003.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/pcvue/public/pc/003.png -------------------------------------------------------------------------------- /pcvue/public/pc/004.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/pcvue/public/pc/004.png -------------------------------------------------------------------------------- /pcvue/public/pc/005.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/pcvue/public/pc/005.png -------------------------------------------------------------------------------- /pcvue/public/pc/006.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/pcvue/public/pc/006.png -------------------------------------------------------------------------------- /pcvue/public/pc/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/pcvue/public/pc/logo.png -------------------------------------------------------------------------------- /pcvue/public/pc/user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/pcvue/public/pc/user.png -------------------------------------------------------------------------------- /litemall-admin/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | '@vue/app' 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /litemall/doc/unused/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall/doc/unused/3.png -------------------------------------------------------------------------------- /litemall/doc/unused/5.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall/doc/unused/5.gif -------------------------------------------------------------------------------- /litemall/doc/unused/qq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall/doc/unused/qq.png -------------------------------------------------------------------------------- /litemall/doc/unused/qq2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall/doc/unused/qq2.png -------------------------------------------------------------------------------- /pcvue/public/login/bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/pcvue/public/login/bg.png -------------------------------------------------------------------------------- /pcvue/public/music/chat.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/pcvue/public/music/chat.wav -------------------------------------------------------------------------------- /pcvue/public/pc/adv001.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/pcvue/public/pc/adv001.jpg -------------------------------------------------------------------------------- /pcvue/src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/pcvue/src/assets/logo.png -------------------------------------------------------------------------------- /pcvue/public/pc/pc_alipay.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/pcvue/public/pc/pc_alipay.jpg -------------------------------------------------------------------------------- /pcvue/public/pc/pc_wxpay.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/pcvue/public/pc/pc_wxpay.jpg -------------------------------------------------------------------------------- /litemall-admin/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | autoprefixer: {} 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /litemall/doc/pics/admin/get.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall/doc/pics/admin/get.png -------------------------------------------------------------------------------- /litemall/doc/pics/readme/qq3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall/doc/pics/readme/qq3.png -------------------------------------------------------------------------------- /litemall/doc/unused/litemall.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall/doc/unused/litemall.ico -------------------------------------------------------------------------------- /litemall/doc/unused/litemall.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall/doc/unused/litemall.png -------------------------------------------------------------------------------- /pcvue/public/fonts/iconfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/pcvue/public/fonts/iconfont.eot -------------------------------------------------------------------------------- /pcvue/public/fonts/iconfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/pcvue/public/fonts/iconfont.ttf -------------------------------------------------------------------------------- /pcvue/public/fonts/iconfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/pcvue/public/fonts/iconfont.woff -------------------------------------------------------------------------------- /pcvue/public/login/login_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/pcvue/public/login/login_bg.png -------------------------------------------------------------------------------- /pcvue/public/pc/address_pos.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/pcvue/public/pc/address_pos.jpg -------------------------------------------------------------------------------- /pcvue/public/pc/cart_empty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/pcvue/public/pc/cart_empty.png -------------------------------------------------------------------------------- /pcvue/public/pc/integral_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/pcvue/public/pc/integral_01.png -------------------------------------------------------------------------------- /pcvue/public/pc/integral_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/pcvue/public/pc/integral_02.png -------------------------------------------------------------------------------- /pcvue/public/pc/integral_03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/pcvue/public/pc/integral_03.png -------------------------------------------------------------------------------- /pcvue/public/pc/summary-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/pcvue/public/pc/summary-bg.jpg -------------------------------------------------------------------------------- /pcvue/src/assets/default_pic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/pcvue/src/assets/default_pic.png -------------------------------------------------------------------------------- /litemall-admin/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall-admin/public/favicon.ico -------------------------------------------------------------------------------- /litemall/doc/pics/admin/login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall/doc/pics/admin/login.png -------------------------------------------------------------------------------- /litemall/doc/pics/faq/excluded.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall/doc/pics/faq/excluded.png -------------------------------------------------------------------------------- /pcvue/public/fonts/iconfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/pcvue/public/fonts/iconfont.woff2 -------------------------------------------------------------------------------- /pcvue/public/pc/default_avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/pcvue/public/pc/default_avatar.png -------------------------------------------------------------------------------- /litemall/doc/pics/database/admin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall/doc/pics/database/admin.png -------------------------------------------------------------------------------- /litemall/doc/pics/database/goods.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall/doc/pics/database/goods.png -------------------------------------------------------------------------------- /litemall/doc/pics/database/order.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall/doc/pics/database/order.png -------------------------------------------------------------------------------- /litemall/doc/pics/database/others.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall/doc/pics/database/others.png -------------------------------------------------------------------------------- /litemall/doc/pics/database/user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall/doc/pics/database/user.png -------------------------------------------------------------------------------- /litemall/doc/pics/project/stage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall/doc/pics/project/stage.png -------------------------------------------------------------------------------- /litemall/doc/pics/readme/mobmall.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall/doc/pics/readme/mobmall.png -------------------------------------------------------------------------------- /pcvue/public/pc/default_store_adv.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/pcvue/public/pc/default_store_adv.jpg -------------------------------------------------------------------------------- /pcvue/public/pc/loading_pic_200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/pcvue/public/pc/loading_pic_200.png -------------------------------------------------------------------------------- /pcvue/public/pc/loading_pic_400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/pcvue/public/pc/loading_pic_400.png -------------------------------------------------------------------------------- /pcvue/public/pc/not-common-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/pcvue/public/pc/not-common-icon.png -------------------------------------------------------------------------------- /pcvue/src/assets/default_avatar.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/pcvue/src/assets/default_avatar.jpg -------------------------------------------------------------------------------- /litemall/doc/pics/platform/db-main.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall/doc/pics/platform/db-main.png -------------------------------------------------------------------------------- /litemall/doc/pics/admin/get_no_token.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall/doc/pics/admin/get_no_token.png -------------------------------------------------------------------------------- /litemall/doc/pics/admin/get_with_token.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall/doc/pics/admin/get_with_token.png -------------------------------------------------------------------------------- /litemall/doc/pics/admin/post_no_token.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall/doc/pics/admin/post_no_token.png -------------------------------------------------------------------------------- /litemall/doc/pics/project/idea-run-all.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall/doc/pics/project/idea-run-all.png -------------------------------------------------------------------------------- /litemall/doc/pics/project/yml-resource.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall/doc/pics/project/yml-resource.png -------------------------------------------------------------------------------- /litemall-admin/src/assets/401_images/401.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall-admin/src/assets/401_images/401.gif -------------------------------------------------------------------------------- /litemall-admin/src/assets/404_images/404.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall-admin/src/assets/404_images/404.png -------------------------------------------------------------------------------- /litemall/doc/pics/admin/post_with_token.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall/doc/pics/admin/post_with_token.png -------------------------------------------------------------------------------- /litemall/doc/pics/database/order-status.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall/doc/pics/database/order-status.png -------------------------------------------------------------------------------- /litemall/doc/pics/project/deploy-single.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall/doc/pics/project/deploy-single.png -------------------------------------------------------------------------------- /litemall/doc/pics/project/develop-stage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall/doc/pics/project/develop-stage.png -------------------------------------------------------------------------------- /litemall/doc/pics/project/maven-profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall/doc/pics/project/maven-profile.png -------------------------------------------------------------------------------- /litemall/doc/pics/project/online-deploy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall/doc/pics/project/online-deploy.png -------------------------------------------------------------------------------- /litemall/doc/pics/project/security-group.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall/doc/pics/project/security-group.png -------------------------------------------------------------------------------- /litemall/doc/pics/project/spring-profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall/doc/pics/project/spring-profile.png -------------------------------------------------------------------------------- /litemall/doc/pics/readme/admin-dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall/doc/pics/readme/admin-dashboard.png -------------------------------------------------------------------------------- /litemall/doc/pics/readme/renard_wx_demo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall/doc/pics/readme/renard_wx_demo.png -------------------------------------------------------------------------------- /litemall/doc/pics/project/project-structure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall/doc/pics/project/project-structure.png -------------------------------------------------------------------------------- /litemall/doc/pics/readme/litemall_wx_demo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall/doc/pics/readme/litemall_wx_demo.png -------------------------------------------------------------------------------- /litemall/doc/pics/readme/project-structure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall/doc/pics/readme/project-structure.png -------------------------------------------------------------------------------- /litemall/doc/pics/readme/technology-stack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall/doc/pics/readme/technology-stack.png -------------------------------------------------------------------------------- /litemall/doc/pics/platform/mybatis-generator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall/doc/pics/platform/mybatis-generator.png -------------------------------------------------------------------------------- /litemall/doc/pics/project/idea-maven-insatll.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall/doc/pics/project/idea-maven-insatll.png -------------------------------------------------------------------------------- /litemall-admin/src/assets/404_images/404_cloud.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall-admin/src/assets/404_images/404_cloud.png -------------------------------------------------------------------------------- /litemall/doc/note.md: -------------------------------------------------------------------------------- 1 | # 项目笔记 2 | 3 | 记录本项目开发中一些关键技术点。 4 | 5 | 注意: 6 | > 这些技术并不是绝对正确或者唯一,而是目前项目所采用。 7 | 8 | ## 1. 前后端交互技术 9 | 10 | ## 2. 错误码 -------------------------------------------------------------------------------- /litemall/litemall-core/src/main/resources/back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall/litemall-core/src/main/resources/back.png -------------------------------------------------------------------------------- /litemall/litemall-core/src/test/resources/litemall.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall/litemall-core/src/test/resources/litemall.png -------------------------------------------------------------------------------- /litemall/litemall-core/src/main/resources/back_groupon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall/litemall-core/src/main/resources/back_groupon.png -------------------------------------------------------------------------------- /litemall-admin/public/tinymce4.7.5/skins/lightgray/img/trans.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall-admin/public/tinymce4.7.5/skins/lightgray/img/trans.gif -------------------------------------------------------------------------------- /litemall-admin/public/tinymce4.7.5/skins/lightgray/img/anchor.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall-admin/public/tinymce4.7.5/skins/lightgray/img/anchor.gif -------------------------------------------------------------------------------- /litemall-admin/public/tinymce4.7.5/skins/lightgray/img/loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall-admin/public/tinymce4.7.5/skins/lightgray/img/loader.gif -------------------------------------------------------------------------------- /litemall-admin/public/tinymce4.7.5/skins/lightgray/img/object.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall-admin/public/tinymce4.7.5/skins/lightgray/img/object.gif -------------------------------------------------------------------------------- /litemall/deploy/bin/stop.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | PID=$(ps -ef | grep litemall.jar | grep -v grep | awk '{ print $2 }') 4 | 5 | if [ ! -z "$PID" ] 6 | then 7 | kill $PID 8 | fi -------------------------------------------------------------------------------- /litemall-admin/.env.deployment: -------------------------------------------------------------------------------- 1 | NODE_ENV = production 2 | 3 | # just a flag 4 | ENV = 'deploymenet' 5 | 6 | # base api 7 | VUE_APP_BASE_API = 'http://123.206.215.59/shop/admin' 8 | 9 | -------------------------------------------------------------------------------- /litemall-admin/.env.production: -------------------------------------------------------------------------------- 1 | NODE_ENV = production 2 | 3 | # just a flag 4 | ENV = 'production' 5 | 6 | # base api 7 | VUE_APP_BASE_API = 'http://123.206.215.59/shop/admin' 8 | 9 | -------------------------------------------------------------------------------- /litemall-admin/public/tinymce4.7.5/skins/lightgray/fonts/tinymce.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall-admin/public/tinymce4.7.5/skins/lightgray/fonts/tinymce.eot -------------------------------------------------------------------------------- /litemall-admin/public/tinymce4.7.5/skins/lightgray/fonts/tinymce.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall-admin/public/tinymce4.7.5/skins/lightgray/fonts/tinymce.ttf -------------------------------------------------------------------------------- /litemall-admin/public/tinymce4.7.5/skins/lightgray/fonts/tinymce.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall-admin/public/tinymce4.7.5/skins/lightgray/fonts/tinymce.woff -------------------------------------------------------------------------------- /litemall-admin/public/tinymce4.7.5/plugins/emoticons/img/smiley-cool.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall-admin/public/tinymce4.7.5/plugins/emoticons/img/smiley-cool.gif -------------------------------------------------------------------------------- /litemall-admin/public/tinymce4.7.5/plugins/emoticons/img/smiley-cry.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall-admin/public/tinymce4.7.5/plugins/emoticons/img/smiley-cry.gif -------------------------------------------------------------------------------- /litemall-admin/public/tinymce4.7.5/plugins/emoticons/img/smiley-kiss.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall-admin/public/tinymce4.7.5/plugins/emoticons/img/smiley-kiss.gif -------------------------------------------------------------------------------- /litemall-admin/public/tinymce4.7.5/plugins/emoticons/img/smiley-wink.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall-admin/public/tinymce4.7.5/plugins/emoticons/img/smiley-wink.gif -------------------------------------------------------------------------------- /litemall-admin/public/tinymce4.7.5/plugins/emoticons/img/smiley-yell.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall-admin/public/tinymce4.7.5/plugins/emoticons/img/smiley-yell.gif -------------------------------------------------------------------------------- /litemall-admin/jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": "./", 4 | "paths": { 5 | "@/*": ["src/*"] 6 | } 7 | }, 8 | "exclude": ["node_modules", "dist"] 9 | } -------------------------------------------------------------------------------- /litemall-admin/public/tinymce4.7.5/plugins/emoticons/img/smiley-frown.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall-admin/public/tinymce4.7.5/plugins/emoticons/img/smiley-frown.gif -------------------------------------------------------------------------------- /litemall-admin/public/tinymce4.7.5/plugins/emoticons/img/smiley-sealed.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall-admin/public/tinymce4.7.5/plugins/emoticons/img/smiley-sealed.gif -------------------------------------------------------------------------------- /litemall-admin/public/tinymce4.7.5/plugins/emoticons/img/smiley-smile.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall-admin/public/tinymce4.7.5/plugins/emoticons/img/smiley-smile.gif -------------------------------------------------------------------------------- /litemall-admin/public/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall-admin/public/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.eot -------------------------------------------------------------------------------- /litemall-admin/public/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall-admin/public/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.ttf -------------------------------------------------------------------------------- /litemall/docker/bin/deploy.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cd /home/ubuntu/docker 4 | sudo docker-compose down 5 | sudo docker-compose build 6 | sudo docker image prune -f 7 | sudo docker-compose up -d 8 | -------------------------------------------------------------------------------- /litemall-admin/public/tinymce4.7.5/plugins/emoticons/img/smiley-innocent.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall-admin/public/tinymce4.7.5/plugins/emoticons/img/smiley-innocent.gif -------------------------------------------------------------------------------- /litemall-admin/public/tinymce4.7.5/plugins/emoticons/img/smiley-laughing.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall-admin/public/tinymce4.7.5/plugins/emoticons/img/smiley-laughing.gif -------------------------------------------------------------------------------- /litemall-admin/public/tinymce4.7.5/plugins/emoticons/img/smiley-surprised.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall-admin/public/tinymce4.7.5/plugins/emoticons/img/smiley-surprised.gif -------------------------------------------------------------------------------- /litemall-admin/public/tinymce4.7.5/plugins/emoticons/img/smiley-undecided.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall-admin/public/tinymce4.7.5/plugins/emoticons/img/smiley-undecided.gif -------------------------------------------------------------------------------- /litemall-admin/public/tinymce4.7.5/skins/lightgray/fonts/tinymce-mobile.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall-admin/public/tinymce4.7.5/skins/lightgray/fonts/tinymce-mobile.woff -------------------------------------------------------------------------------- /litemall-admin/public/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall-admin/public/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.woff -------------------------------------------------------------------------------- /litemall-admin/src/App.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | -------------------------------------------------------------------------------- /litemall/docker/db/conf.d/my.cnf: -------------------------------------------------------------------------------- 1 | [mysqld] 2 | wait_timeout=1814400 3 | max_allowed_packet = 100M 4 | default-time_zone = '+8:00' 5 | character-set-server=utf8mb4 6 | collation-server=utf8mb4_unicode_ci -------------------------------------------------------------------------------- /litemall-admin/public/tinymce4.7.5/plugins/emoticons/img/smiley-embarassed.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall-admin/public/tinymce4.7.5/plugins/emoticons/img/smiley-embarassed.gif -------------------------------------------------------------------------------- /litemall-admin/public/tinymce4.7.5/plugins/emoticons/img/smiley-money-mouth.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall-admin/public/tinymce4.7.5/plugins/emoticons/img/smiley-money-mouth.gif -------------------------------------------------------------------------------- /litemall-admin/public/tinymce4.7.5/plugins/emoticons/img/smiley-tongue-out.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall-admin/public/tinymce4.7.5/plugins/emoticons/img/smiley-tongue-out.gif -------------------------------------------------------------------------------- /litemall-admin/public/tinymce4.7.5/plugins/emoticons/img/smiley-foot-in-mouth.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liijun/GxShop/HEAD/litemall-admin/public/tinymce4.7.5/plugins/emoticons/img/smiley-foot-in-mouth.gif -------------------------------------------------------------------------------- /litemall-admin/src/icons/svg/chart.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /litemall/docker/litemall/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM openjdk:8-jre 2 | COPY application.yml application.yml 3 | COPY litemall.jar litemall.jar 4 | ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","litemall.jar"] -------------------------------------------------------------------------------- /litemall-admin/src/api/log.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export function listLog(query) { 4 | return request({ 5 | url: '/log/list', 6 | method: 'get', 7 | params: query 8 | }) 9 | } 10 | -------------------------------------------------------------------------------- /pcvue/src/plugins/element.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Element from 'element-ui' 3 | import 'element-ui/lib/theme-chalk/index.css' 4 | 5 | Vue.use(Element) 6 | Vue.prototype.$ELEMENT = { size: 'small', zIndex: 3000 }; 7 | -------------------------------------------------------------------------------- /litemall-admin/src/api/dashboard.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export function info(query) { 4 | return request({ 5 | url: '/dashboard', 6 | method: 'get', 7 | params: query 8 | }) 9 | } 10 | -------------------------------------------------------------------------------- /litemall-admin/src/icons/svg/size.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /litemall-admin/src/views/layout/components/index.js: -------------------------------------------------------------------------------- 1 | export { default as AppMain } from './AppMain' 2 | export { default as Navbar } from './Navbar' 3 | export { default as Sidebar } from './Sidebar/index.vue' 4 | export { default as TagsView } from './TagsView/index.vue' 5 | -------------------------------------------------------------------------------- /litemall/litemall-db/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | profiles: 3 | active: db 4 | messages: 5 | encoding: UTF-8 6 | 7 | logging: 8 | level: 9 | root: ERROR 10 | org.springframework: ERROR 11 | org.mybatis: ERROR 12 | org.linlinjava.litemall.db: DEBUG -------------------------------------------------------------------------------- /litemall/deploy/bin/deploy.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # 本脚本的作用是停止当前Spring Boot应用,然后再次部署 4 | PID=$(ps -ef | grep litemall.jar | grep -v grep | awk '{ print $2 }') 5 | 6 | if [ ! -z "$PID" ] 7 | then 8 | kill $PID 9 | fi 10 | 11 | cd /data/litemall || exit 2 12 | nohup java -jar litemall.jar > log.log 2>&1 & -------------------------------------------------------------------------------- /litemall/litemall-core/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | profiles: 3 | active: core, db 4 | messages: 5 | encoding: UTF-8 6 | 7 | logging: 8 | level: 9 | root: ERROR 10 | org.springframework: ERROR 11 | org.mybatis: ERROR 12 | org.linlinjava.litemall.core: DEBUG -------------------------------------------------------------------------------- /litemall-admin/src/views/login/authredirect.vue: -------------------------------------------------------------------------------- 1 | 11 | -------------------------------------------------------------------------------- /litemall-admin/src/icons/svg/link.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /litemall/litemall-all-war/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | profiles: 3 | active: db, core, admin, wx 4 | messages: 5 | encoding: UTF-8 6 | servlet: 7 | multipart: 8 | max-file-size: 20MB 9 | max-request-size: 20MB 10 | 11 | logging: 12 | config: classpath:logback-spring.xml -------------------------------------------------------------------------------- /litemall/litemall-db/src/main/java/org/linlinjava/litemall/db/dao/StatMapper.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.db.dao; 2 | 3 | import java.util.List; 4 | import java.util.Map; 5 | 6 | public interface StatMapper { 7 | List statUser(); 8 | 9 | List statOrder(); 10 | 11 | List statGoods(); 12 | } -------------------------------------------------------------------------------- /pcvue/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | 5 | # local env files 6 | .env.local 7 | .env.*.local 8 | 9 | # Log files 10 | npm-debug.log* 11 | yarn-debug.log* 12 | yarn-error.log* 13 | 14 | # Editor directories and files 15 | .idea 16 | .vscode 17 | *.suo 18 | *.ntvs* 19 | *.njsproj 20 | *.sln 21 | *.sw? 22 | -------------------------------------------------------------------------------- /litemall-admin/.editorconfig: -------------------------------------------------------------------------------- 1 | # https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | end_of_line = lf 9 | insert_final_newline = true 10 | trim_trailing_whitespace = true 11 | 12 | [*.md] 13 | insert_final_newline = false 14 | trim_trailing_whitespace = false 15 | -------------------------------------------------------------------------------- /litemall-admin/src/views/redirect/index.vue: -------------------------------------------------------------------------------- 1 | 13 | -------------------------------------------------------------------------------- /litemall-admin/src/icons/svg/guide.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /litemall-admin/src/icons/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import SvgIcon from '@/components/SvgIcon'// svg组件 3 | 4 | // register globally 5 | Vue.component('svg-icon', SvgIcon) 6 | 7 | const req = require.context('./svg', false, /\.svg$/) 8 | const requireAll = requireContext => requireContext.keys().map(requireContext) 9 | requireAll(req) 10 | -------------------------------------------------------------------------------- /litemall-admin/src/icons/svg/component.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /litemall/doc/README.md: -------------------------------------------------------------------------------- 1 | # Table of Contents 2 | 3 | * [介绍](../README.md) 4 | * [更新日志](../CHANGELOG.md) 5 | * [贡献指南](../CONTRIBUTE.md) 6 | * [FAQ](./FAQ.md) 7 | * [API](./api.md) 8 | * [数据库](./database.md) 9 | * [1. 系统架构](./project.md) 10 | * [2. 基础系统](./platform.md) 11 | * [3. 小商场](./wxmall.md) 12 | * [4. 管理后台](./admin.md) 13 | * [5. 轻商城](./mobmall.md) -------------------------------------------------------------------------------- /litemall/litemall-core/src/main/java/org/linlinjava/litemall/core/config/AsyncConfig.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.core.config; 2 | 3 | import org.springframework.context.annotation.Configuration; 4 | import org.springframework.scheduling.annotation.EnableAsync; 5 | 6 | @Configuration 7 | @EnableAsync 8 | public class AsyncConfig { 9 | } 10 | -------------------------------------------------------------------------------- /litemall-admin/src/directive/clipboard/index.js: -------------------------------------------------------------------------------- 1 | import Clipboard from './clipboard' 2 | 3 | const install = function(Vue) { 4 | Vue.directive('Clipboard', Clipboard) 5 | } 6 | 7 | if (window.Vue) { 8 | window.clipboard = Clipboard 9 | Vue.use(install); // eslint-disable-line 10 | } 11 | 12 | Clipboard.install = install 13 | export default Clipboard 14 | -------------------------------------------------------------------------------- /litemall-admin/src/icons/svg/money.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /litemall-admin/src/api/region.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export function listRegion() { 4 | return request({ 5 | url: '/region/list', 6 | method: 'get' 7 | }) 8 | } 9 | 10 | export function listSubRegion(query) { 11 | return request({ 12 | url: '/region/clist', 13 | method: 'get', 14 | params: query 15 | }) 16 | } 17 | -------------------------------------------------------------------------------- /litemall/litemall-db/src/main/java/org/linlinjava/litemall/db/dao/GoodsProductMapper.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.db.dao; 2 | 3 | import org.apache.ibatis.annotations.Param; 4 | 5 | public interface GoodsProductMapper { 6 | int addStock(@Param("id") Integer id, @Param("num") Short num); 7 | int reduceStock(@Param("id") Integer id, @Param("num") Short num); 8 | } -------------------------------------------------------------------------------- /litemall-admin/src/directive/permission/index.js: -------------------------------------------------------------------------------- 1 | import permission from './permission' 2 | 3 | const install = function(Vue) { 4 | Vue.directive('permission', permission) 5 | } 6 | 7 | if (window.Vue) { 8 | window['permission'] = permission 9 | Vue.use(install); // eslint-disable-line 10 | } 11 | 12 | permission.install = install 13 | export default permission 14 | -------------------------------------------------------------------------------- /litemall-admin/src/icons/svg/drag.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /litemall-admin/src/icons/svg/email.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /litemall-admin/src/icons/svgo.yml: -------------------------------------------------------------------------------- 1 | # replace default config 2 | 3 | # multipass: true 4 | # full: true 5 | 6 | plugins: 7 | 8 | # - name 9 | # 10 | # or: 11 | # - name: false 12 | # - name: true 13 | # 14 | # or: 15 | # - name: 16 | # param1: 1 17 | # param2: 2 18 | 19 | - removeAttrs: 20 | attrs: 21 | - 'fill' 22 | - 'fill-rule' 23 | -------------------------------------------------------------------------------- /litemall-admin/src/utils/auth.js: -------------------------------------------------------------------------------- 1 | import Cookies from 'js-cookie' 2 | 3 | const TokenKey = 'X-Litemall-Admin-Token' 4 | 5 | export function getToken() { 6 | return Cookies.get(TokenKey) 7 | } 8 | 9 | export function setToken(token) { 10 | return Cookies.set(TokenKey, token) 11 | } 12 | 13 | export function removeToken() { 14 | return Cookies.remove(TokenKey) 15 | } 16 | -------------------------------------------------------------------------------- /litemall/litemall-db/src/main/java/org/linlinjava/litemall/db/util/CouponUserConstant.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.db.util; 2 | 3 | public class CouponUserConstant { 4 | public static final Short STATUS_USABLE = 0; 5 | public static final Short STATUS_USED = 1; 6 | public static final Short STATUS_EXPIRED = 2; 7 | public static final Short STATUS_OUT = 3; 8 | } 9 | -------------------------------------------------------------------------------- /litemall-admin/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | dist/ 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | **/*.log 8 | 9 | tests/**/coverage/ 10 | tests/e2e/reports 11 | selenium-debug.log 12 | 13 | # Editor directories and files 14 | .idea 15 | .vscode 16 | *.suo 17 | *.ntvs* 18 | *.njsproj 19 | *.sln 20 | *.local 21 | 22 | package-lock.json 23 | yarn.lock 24 | -------------------------------------------------------------------------------- /litemall-admin/src/api/comment.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export function listComment(query) { 4 | return request({ 5 | url: '/comment/list', 6 | method: 'get', 7 | params: query 8 | }) 9 | } 10 | 11 | export function deleteComment(data) { 12 | return request({ 13 | url: '/comment/delete', 14 | method: 'post', 15 | data 16 | }) 17 | } 18 | -------------------------------------------------------------------------------- /litemall-admin/src/icons/svg/guide 2.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /litemall/litemall-db/sql/litemall_schema.sql: -------------------------------------------------------------------------------- 1 | drop database if exists litemall; 2 | drop user if exists 'litemall'@'%'; 3 | -- 支持emoji:需要mysql数据库参数: character_set_server=utf8mb4 4 | create database litemall default character set utf8mb4 collate utf8mb4_unicode_ci; 5 | use litemall; 6 | create user 'litemall'@'%' identified by 'litemall123456'; 7 | grant all privileges on litemall.* to 'litemall'@'%'; 8 | flush privileges; -------------------------------------------------------------------------------- /litemall/doc/performance.md: -------------------------------------------------------------------------------- 1 | # 性能 2 | 3 | ## 1 小程序性能 4 | 5 | ## 2 VUE性能 6 | 7 | ## 3 Spring Boot性能 8 | 9 | ### 3.1 gzip压缩 10 | 11 | 在litemall-all模块中配置gzip压缩 12 | ``` 13 | server: 14 | compression: 15 | enabled: true 16 | min-response-size: 2048 17 | mime-types: application/javascript,text/css,application/json,application/xml,text/html,text/xml,text/plain 18 | ``` 19 | 20 | ## 4 数据库性能 21 | 22 | ## 5 其他 -------------------------------------------------------------------------------- /litemall/litemall-wx-api/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | profiles: 3 | active: db, core, wx 4 | messages: 5 | encoding: UTF-8 6 | 7 | server: 8 | port: 8082 9 | 10 | logging: 11 | level: 12 | root: ERROR 13 | org.springframework: ERROR 14 | org.mybatis: ERROR 15 | org.linlinjava.litemall.wx: DEBUG 16 | org.linlinjava.litemall: ERROR 17 | 18 | swagger: 19 | production: false -------------------------------------------------------------------------------- /pcvue/src/views/index.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 22 | -------------------------------------------------------------------------------- /litemall/litemall-admin-api/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | profiles: 3 | active: db, core, admin 4 | messages: 5 | encoding: UTF-8 6 | 7 | server: 8 | port: 8083 9 | 10 | logging: 11 | level: 12 | root: ERROR 13 | org.springframework: ERROR 14 | org.mybatis: ERROR 15 | org.linlinjava.litemall.admin: DEBUG 16 | org.linlinjava.litemall: ERROR 17 | 18 | swagger: 19 | production: false -------------------------------------------------------------------------------- /litemall-admin/src/icons/svg/documentation.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /litemall/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/annotation/LoginUser.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.wx.annotation; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | 9 | @Target(ElementType.PARAMETER) 10 | @Retention(RetentionPolicy.RUNTIME) 11 | public @interface LoginUser { 12 | 13 | } 14 | -------------------------------------------------------------------------------- /litemall-admin/src/icons/svg/user.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /litemall-admin/src/icons/svg/lock.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /litemall/litemall-core/src/main/java/org/linlinjava/litemall/core/notify/NotifyType.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.core.notify; 2 | 3 | public enum NotifyType { 4 | PAY_SUCCEED("paySucceed"), 5 | SHIP("ship"), 6 | REFUND("refund"), 7 | CAPTCHA("captcha"); 8 | 9 | private String type; 10 | 11 | NotifyType(String type) { 12 | this.type = type; 13 | } 14 | 15 | public String getType() { 16 | return this.type; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /litemall/litemall-db/sql/README.md: -------------------------------------------------------------------------------- 1 | 这里的数据库由三个sql文件组成: 2 | 3 | 1. litemall_schema.sql 4 | 5 | 作用是创建空数据库、创建用户、设置访问权限。 6 | 7 | 开发者开发测试阶段可以使用,但是部署生产阶段一定要注意修改这里的默认用户名和密码。 8 | 9 | 2. litemall_table.sql 10 | 11 | 作用是创建数据库表,但是没有创建任何数据。 12 | 13 | 因此,开发者可以在部署生产阶段直接使用。 14 | 15 | 3. litemall_data.sql 16 | 17 | 作用是创建测试数据。 18 | 19 | 这里的测试数据来自开源项目[nideshop-mini-program](https://github.com/tumobi/nideshop-mini-program) 20 | 21 | 开发者开发测试阶段可以使用,但是部署开发阶段应该使用自己的数据。 -------------------------------------------------------------------------------- /litemall-admin/src/icons/svg/excel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /litemall-admin/src/store/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Vuex from 'vuex' 3 | import app from './modules/app' 4 | import permission from './modules/permission' 5 | import tagsView from './modules/tagsView' 6 | import user from './modules/user' 7 | import getters from './getters' 8 | 9 | Vue.use(Vuex) 10 | 11 | const store = new Vuex.Store({ 12 | modules: { 13 | app, 14 | permission, 15 | tagsView, 16 | user 17 | }, 18 | getters 19 | }) 20 | 21 | export default store 22 | -------------------------------------------------------------------------------- /litemall-admin/src/icons/svg/example.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /litemall/litemall-core/src/test/java/org/linlinjava/litemall/core/IntegerTest.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.core; 2 | 3 | import org.junit.Test; 4 | 5 | public class IntegerTest { 6 | @Test 7 | public void test() { 8 | Integer a = new Integer(512); 9 | int b = 512; 10 | Integer c = new Integer(512); 11 | System.out.println(a==b); 12 | System.out.println(a.equals(b)); 13 | System.out.println(a == c); 14 | System.out.println(a.equals(c)); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /litemall-admin/src/api/stat.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export function statUser(query) { 4 | return request({ 5 | url: '/stat/user', 6 | method: 'get', 7 | params: query 8 | }) 9 | } 10 | 11 | export function statOrder(query) { 12 | return request({ 13 | url: '/stat/order', 14 | method: 'get', 15 | params: query 16 | }) 17 | } 18 | 19 | export function statGoods(query) { 20 | return request({ 21 | url: '/stat/goods', 22 | method: 'get', 23 | params: query 24 | }) 25 | } 26 | -------------------------------------------------------------------------------- /litemall/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/annotation/RequiresPermissionsDesc.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.admin.annotation; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | @Target({ElementType.TYPE, ElementType.METHOD}) 9 | @Retention(RetentionPolicy.RUNTIME) 10 | public @interface RequiresPermissionsDesc { 11 | String[] menu(); 12 | 13 | String button(); 14 | } 15 | -------------------------------------------------------------------------------- /pcvue/src/plugins/vueamap.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import VueAMap from 'vue-amap' 3 | 4 | 5 | // 不知道什么原因,必须要清空localStorage 才不报错 6 | const amapKeys = Object.keys(localStorage).filter(key => key.match(/^_AMap_/)) 7 | 8 | amapKeys.forEach(key => { 9 | localStorage.removeItem(key) 10 | }) 11 | 12 | Vue.use(VueAMap) 13 | 14 | // 初始化vue-amap 15 | VueAMap.initAMapApiLoader({ 16 | // 高德的key 17 | key: '79f3a628c906e1fc7384a6f19d478ae3', 18 | // 插件集合 19 | plugin: ['AMap.Autocomplete', 'AMap.Scale', 'AMap.ToolBar', 'AMap.MapType','AMap.Geolocation'], 20 | v: '1.4.4' 21 | }); -------------------------------------------------------------------------------- /litemall-admin/src/icons/svg/star.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /litemall/litemall-all/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | profiles: 3 | active: db, core, admin, wx 4 | messages: 5 | encoding: UTF-8 6 | servlet: 7 | multipart: 8 | max-file-size: 20MB 9 | max-request-size: 20MB 10 | 11 | server: 12 | port: 8080 13 | compression: 14 | enabled: true 15 | min-response-size: 2048 16 | mime-types: application/javascript,text/css,application/json,application/xml,text/html,text/xml,text/plain 17 | 18 | logging: 19 | config: classpath:logback-spring.xml 20 | 21 | swagger: 22 | production: false -------------------------------------------------------------------------------- /litemall/litemall-db/src/main/java/org/linlinjava/litemall/db/domain/UserVo.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.db.domain; 2 | 3 | public class UserVo { 4 | private String nickname; 5 | private String avatar; 6 | 7 | public String getNickname() { 8 | return nickname; 9 | } 10 | 11 | public void setNickname(String nickname) { 12 | this.nickname = nickname; 13 | } 14 | 15 | public String getAvatar() { 16 | return avatar; 17 | } 18 | 19 | public void setAvatar(String avatar) { 20 | this.avatar = avatar; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /litemall/litemall-db/src/test/java/org/linlinjava/litemall/db/Application.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.db; 2 | 3 | import org.mybatis.spring.annotation.MapperScan; 4 | import org.springframework.boot.SpringApplication; 5 | import org.springframework.boot.autoconfigure.SpringBootApplication; 6 | 7 | @SpringBootApplication(scanBasePackages = {"org.linlinjava.litemall.db"}) 8 | @MapperScan("org.linlinjava.litemall.db.dao") 9 | public class Application { 10 | 11 | public static void main(String[] args) { 12 | SpringApplication.run(Application.class, args); 13 | } 14 | 15 | } -------------------------------------------------------------------------------- /litemall/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/dto/WxLoginInfo.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.wx.dto; 2 | 3 | public class WxLoginInfo { 4 | private String code; 5 | private UserInfo userInfo; 6 | 7 | public String getCode() { 8 | return code; 9 | } 10 | 11 | public void setCode(String code) { 12 | this.code = code; 13 | } 14 | 15 | public UserInfo getUserInfo() { 16 | return userInfo; 17 | } 18 | 19 | public void setUserInfo(UserInfo userInfo) { 20 | this.userInfo = userInfo; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /pcvue/src/plugins/local-storage.js: -------------------------------------------------------------------------------- 1 | export const getLocalStorage = (...args) => { 2 | const storage = {}; 3 | args.forEach(arg => { 4 | storage[arg] = window.localStorage.getItem(arg) || null; 5 | }); 6 | return storage; 7 | }; 8 | 9 | export const setLocalStorage = data => { 10 | Object.keys(data).forEach(prop => { 11 | const el = data[prop]; 12 | window.localStorage.setItem(prop, el); 13 | }); 14 | }; 15 | 16 | export const removeLocalStorage = (...args) => { 17 | args.forEach(arg => { 18 | window.localStorage.removeItem(arg); 19 | }); 20 | }; 21 | -------------------------------------------------------------------------------- /litemall-admin/src/icons/svg/table.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /litemall/doc/mobmall.md: -------------------------------------------------------------------------------- 1 | # 5 litemall轻商城 2 | 3 | litemall轻商城,是商城移动版本。 4 | 5 | 技术: 6 | 7 | * 轻商城前端,即litemall-vue模块 8 | * vue-cli3 9 | * Vue + Vue-router + Vant + Sass 10 | * axios 11 | * fastclick 12 | * babel-polyfill 13 | * @xkeshi/vue-countdown 14 | * Vant 15 | * 轻商城后端,即litemall-wx-api模块,也就是和小商城后端是一样的。 16 | * Spring Boot 2.x 17 | * Spring MVC 18 | * [weixin-java-tools](https://gitee.com/binary/weixin-java-tools) 19 | 20 | 21 | ## 5.1 litemall-wx-api 22 | 23 | 可以阅读3.1 24 | 25 | ## 5.2 litemall-vue 26 | 27 | 这里的代码基于[vant--mobile-mall](https://github.com/qianzhaoy/vant--mobile-mall) 28 | 29 | 文档未完成。 30 | -------------------------------------------------------------------------------- /litemall/litemall-core/src/test/java/org/linlinjava/litemall/core/Application.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.core; 2 | 3 | import org.mybatis.spring.annotation.MapperScan; 4 | import org.springframework.boot.SpringApplication; 5 | import org.springframework.boot.autoconfigure.SpringBootApplication; 6 | 7 | @SpringBootApplication(scanBasePackages = {"org.linlinjava.litemall.db", "org.linlinjava.litemall.core"}) 8 | @MapperScan("org.linlinjava.litemall.db.dao") 9 | public class Application { 10 | 11 | public static void main(String[] args) { 12 | SpringApplication.run(Application.class, args); 13 | } 14 | 15 | } -------------------------------------------------------------------------------- /litemall/litemall-db/src/main/java/org/linlinjava/litemall/db/util/GrouponConstant.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.db.util; 2 | 3 | import org.linlinjava.litemall.db.domain.LitemallOrder; 4 | 5 | public class GrouponConstant { 6 | public static final Short RULE_STATUS_ON = 0; 7 | public static final Short RULE_STATUS_DOWN_EXPIRE = 1; 8 | public static final Short RULE_STATUS_DOWN_ADMIN = 2; 9 | 10 | 11 | public static final Short STATUS_NONE = 0; 12 | public static final Short STATUS_ON = 1; 13 | public static final Short STATUS_SUCCEED = 2; 14 | public static final Short STATUS_FAIL = 3; 15 | } 16 | -------------------------------------------------------------------------------- /litemall/litemall-db/src/test/java/org/linlinjava/litemall/db/DbTest.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.db; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.springframework.boot.test.context.SpringBootTest; 6 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 7 | import org.springframework.test.context.junit4.SpringRunner; 8 | import org.springframework.test.context.web.WebAppConfiguration; 9 | 10 | @WebAppConfiguration 11 | @RunWith(SpringRunner.class) 12 | @SpringBootTest 13 | public class DbTest { 14 | @Test 15 | public void test() { 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /litemall/litemall-core/src/main/java/org/linlinjava/litemall/core/notify/SmsSender.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.core.notify; 2 | 3 | public interface SmsSender { 4 | 5 | /** 6 | * 发送短信息 7 | * 8 | * @param phone 接收通知的电话号码 9 | * @param content 短消息内容 10 | */ 11 | SmsResult send(String phone, String content); 12 | 13 | 14 | /** 15 | * 通过短信模版发送短信息 16 | * @param phone 接收通知的电话号码 17 | * @param templateId 通知模板ID 18 | * @param params 通知模版内容里的参数,类似"您的验证码为{1}"中{1}的值 19 | */ 20 | SmsResult sendWithTemplate(String phone, String templateId, String[] params); 21 | } -------------------------------------------------------------------------------- /litemall-admin/.env.development: -------------------------------------------------------------------------------- 1 | # just a flag 2 | ENV = 'development' 3 | 4 | # base api 5 | VUE_APP_BASE_API = 'http://localhost:8080/admin' 6 | 7 | # vue-cli uses the VUE_CLI_BABEL_TRANSPILE_MODULES environment variable, 8 | # to control whether the babel-plugin-dynamic-import-node plugin is enabled. 9 | # It only does one thing by converting all import() to require(). 10 | # This configuration can significantly increase the speed of hot updates, 11 | # when you have a large number of pages. 12 | # Detail: https://github.com/vuejs/vue-cli/blob/dev/packages/@vue/babel-preset-app/index.js 13 | 14 | VUE_CLI_BABEL_TRANSPILE_MODULES = true 15 | -------------------------------------------------------------------------------- /litemall-admin/src/icons/svg/password.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /litemall-admin/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | <%= webpackConfig.name %> 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /pcvue/src/App.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 18 | 19 | 29 | -------------------------------------------------------------------------------- /litemall-admin/src/icons/svg/tab.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /litemall/litemall-db/src/main/java/org/linlinjava/litemall/db/util/AftersaleConstant.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.db.util; 2 | 3 | public class AftersaleConstant { 4 | public static final Short STATUS_INIT = 0; 5 | public static final Short STATUS_REQUEST = 1; 6 | public static final Short STATUS_RECEPT = 2; 7 | public static final Short STATUS_REFUND = 3; 8 | public static final Short STATUS_REJECT = 4; 9 | public static final Short STATUS_CANCEL = 5; 10 | 11 | public static final Short TYPE_GOODS_MISS = 0; 12 | public static final Short TYPE_GOODS_NEEDLESS = 1; 13 | public static final Short TYPE_GOODS_REQUIRED = 2; 14 | } 15 | -------------------------------------------------------------------------------- /litemall-admin/src/store/getters.js: -------------------------------------------------------------------------------- 1 | const getters = { 2 | sidebar: state => state.app.sidebar, 3 | language: state => state.app.language, 4 | size: state => state.app.size, 5 | device: state => state.app.device, 6 | visitedViews: state => state.tagsView.visitedViews, 7 | cachedViews: state => state.tagsView.cachedViews, 8 | token: state => state.user.token, 9 | avatar: state => state.user.avatar, 10 | name: state => state.user.name, 11 | roles: state => state.user.roles, 12 | perms: state => state.user.perms, 13 | permission_routes: state => state.permission.routes, 14 | addRoutes: state => state.permission.addRoutes 15 | } 16 | export default getters 17 | -------------------------------------------------------------------------------- /litemall/litemall-db/src/test/java/org/linlinjava/litemall/db/DbUtilTest.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.db; 2 | 3 | import org.junit.Test; 4 | import org.linlinjava.litemall.db.util.DbUtil; 5 | 6 | import java.io.File; 7 | 8 | public class DbUtilTest { 9 | @Test 10 | public void testBackup() { 11 | File file = new File("test.sql"); 12 | DbUtil.backup(file, "litemall", "litemall123456", "litemall"); 13 | } 14 | 15 | // 这个测试用例会重置litemall数据库,所以比较危险,请开发者注意 16 | // @Test 17 | public void testLoad() { 18 | File file = new File("test.sql"); 19 | DbUtil.load(file, "litemall", "litemall123456", "litemall"); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /litemall-admin/src/icons/svg/message.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /litemall/litemall-core/src/main/java/org/linlinjava/litemall/core/util/DateTimeUtil.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.core.util; 2 | 3 | import java.time.LocalDateTime; 4 | import java.time.format.DateTimeFormatter; 5 | 6 | /** 7 | * 日期格式化工具类 8 | */ 9 | public class DateTimeUtil { 10 | 11 | /** 12 | * 格式 yyyy年MM月dd日 HH:mm:ss 13 | * 14 | * @param dateTime 15 | * @return 16 | */ 17 | public static String getDateTimeDisplayString(LocalDateTime dateTime) { 18 | DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss"); 19 | String strDate2 = dtf2.format(dateTime); 20 | 21 | return strDate2; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /pcvue/src/plugins/vue.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | publicPath: './', 3 | devServer: { 4 | open: true, //浏览器自动打开页面 5 | host: "localhost", //如果是真机测试,就使用这个IP 6 | port: 8080, 7 | https: false, 8 | hotOnly: false, //热更新(webpack已实现了,这里false即可) 9 | proxy: { 10 | //配置跨域-将所有/api的请求拦截,代理到target上 11 | '/wx': { 12 | target: "http://123.206.215.59/shop/wx/", 13 | // target:"http://123.206.215.59:7001/wx", 14 | ws:true, 15 | changOrigin:true, 16 | pathRewrite:{ //---->>>并将/api换成/ 17 | '^/wx':'/' 18 | } 19 | } 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /pcvue/src/store.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Vuex from 'vuex' 3 | 4 | Vue.use(Vuex) 5 | 6 | export default new Vuex.Store({ 7 | state: { 8 | isLogin:false, 9 | userInfo:{}, 10 | permission:[], 11 | goods_class:[], 12 | }, 13 | mutations: { 14 | isLogin(state,userInfo,permission){ 15 | state.isLogin = true; 16 | state.userInfo = userInfo; 17 | state.permission = permission; 18 | }, 19 | set_goods_class (state, goods_class) { 20 | state.goods_class = goods_class 21 | }, 22 | }, 23 | actions: { 24 | set_goods_class ({commit}, goods_class) { 25 | commit('set_goods_class', goods_class) 26 | }, 27 | } 28 | }) 29 | -------------------------------------------------------------------------------- /litemall-admin/src/icons/svg/theme.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /litemall/deploy/bin/reset.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # 本脚本的作用是重置部署环境 4 | # 1.重置数据库 5 | # 2.删除storage文件夹内文件 6 | # 3.调用deploy.sh启动服务 7 | # 注意:由于1和2的原因,请仅在开发测试阶段使用本脚本! 8 | 9 | # 重置数据库 10 | # i. 请在`XXXXXX`处设置相应的root密码 11 | # ii. 同时请注意root密码放在脚本是非常危险的,因此这里仅仅是用于开发测试阶段。 12 | ROOT=root 13 | PASSWORD= 14 | 15 | if test -z "$PASSWORD" 16 | then 17 | echo "请设置云服务器MySQL的root账号密码" 18 | exit 1 19 | fi 20 | 21 | # 导入数据 22 | cd /home/ubuntu/deploy/db || exit 2 23 | mysql -h localhost -u $ROOT -p$PASSWORD < litemall.sql 24 | 25 | # 删除storage文件夹内文件 26 | cd /home/ubuntu/deploy/litemall/storage || exit 2 27 | rm -f ./** 28 | 29 | # 重新部署服务 30 | cd /home/ubuntu/deploy/bin || exit 2 31 | sudo ./stop.sh 32 | sudo ./deploy.sh -------------------------------------------------------------------------------- /litemall/litemall-wx-api/src/test/java/org/linlinjava/litemall/wx/BigDecimalTest.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.wx; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 6 | 7 | import java.math.BigDecimal; 8 | 9 | @RunWith(SpringJUnit4ClassRunner.class) 10 | public class BigDecimalTest { 11 | 12 | @Test 13 | public void test() { 14 | BigDecimal a = new BigDecimal(0); 15 | BigDecimal b = new BigDecimal(1); 16 | BigDecimal c = a.subtract(b); 17 | BigDecimal d = c.max(new BigDecimal(0)); 18 | 19 | System.out.println(c); 20 | System.out.println(d); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /litemall/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/service/UserTokenManager.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.wx.service; 2 | 3 | import org.linlinjava.litemall.wx.util.JwtHelper; 4 | 5 | /** 6 | * 维护用户token 7 | */ 8 | public class UserTokenManager { 9 | public static String generateToken(Integer id) { 10 | JwtHelper jwtHelper = new JwtHelper(); 11 | return jwtHelper.createToken(id); 12 | } 13 | public static Integer getUserId(String token) { 14 | JwtHelper jwtHelper = new JwtHelper(); 15 | Integer userId = jwtHelper.verifyTokenAndGetUserId(token); 16 | if(userId == null || userId == 0){ 17 | return null; 18 | } 19 | return userId; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /litemall/litemall-core/src/main/java/org/linlinjava/litemall/core/notify/SmsResult.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.core.notify; 2 | 3 | /** 4 | * 发送短信的返回结果 5 | */ 6 | public class SmsResult { 7 | private boolean successful; 8 | private Object result; 9 | 10 | /** 11 | * 短信是否发送成功 12 | * 13 | * @return 14 | */ 15 | public boolean isSuccessful() { 16 | return successful; 17 | } 18 | 19 | public void setSuccessful(boolean successful) { 20 | this.successful = successful; 21 | } 22 | 23 | public Object getResult() { 24 | return result; 25 | } 26 | 27 | public void setResult(Object result) { 28 | this.result = result; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /litemall-admin/src/api/login.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export function loginByUsername(username, password, code) { 4 | const data = { 5 | username, 6 | password, 7 | code 8 | } 9 | return request({ 10 | url: '/auth/login', 11 | method: 'post', 12 | data 13 | }) 14 | } 15 | 16 | export function logout() { 17 | return request({ 18 | url: '/auth/logout', 19 | method: 'post' 20 | }) 21 | } 22 | 23 | export function getUserInfo(token) { 24 | return request({ 25 | url: '/auth/info', 26 | method: 'get', 27 | params: { token } 28 | }) 29 | } 30 | 31 | export function getKaptcha() { 32 | return request({ 33 | url: '/auth/kaptcha', 34 | method: 'get' 35 | }) 36 | } 37 | -------------------------------------------------------------------------------- /litemall-admin/src/icons/svg/peoples.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /litemall/litemall-db/src/main/java/org/linlinjava/litemall/db/service/StatService.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.db.service; 2 | 3 | import org.linlinjava.litemall.db.dao.StatMapper; 4 | import org.springframework.stereotype.Service; 5 | 6 | import javax.annotation.Resource; 7 | import java.util.List; 8 | import java.util.Map; 9 | 10 | @Service 11 | public class StatService { 12 | @Resource 13 | private StatMapper statMapper; 14 | 15 | 16 | public List statUser() { 17 | return statMapper.statUser(); 18 | } 19 | 20 | public List statOrder() { 21 | return statMapper.statOrder(); 22 | } 23 | 24 | public List statGoods() { 25 | return statMapper.statGoods(); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /litemall/litemall-db/src/main/java/org/linlinjava/litemall/db/dao/OrderMapper.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.db.dao; 2 | 3 | import org.apache.ibatis.annotations.Param; 4 | import org.linlinjava.litemall.db.domain.LitemallOrder; 5 | import org.linlinjava.litemall.db.domain.OrderVo; 6 | 7 | import java.time.LocalDateTime; 8 | import java.util.List; 9 | import java.util.Map; 10 | 11 | public interface OrderMapper { 12 | int updateWithOptimisticLocker(@Param("lastUpdateTime") LocalDateTime lastUpdateTime, @Param("order") LitemallOrder order); 13 | List getOrderIds(@Param("query") String query, @Param("orderByClause") String orderByClause); 14 | List getOrderList(@Param("query") String query, @Param("orderByClause") String orderByClause); 15 | } -------------------------------------------------------------------------------- /litemall/litemall-db/src/main/java/org/linlinjava/litemall/db/util/CouponConstant.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.db.util; 2 | 3 | public class CouponConstant { 4 | public static final Short TYPE_COMMON = 0; 5 | public static final Short TYPE_REGISTER = 1; 6 | public static final Short TYPE_CODE = 2; 7 | 8 | public static final Short GOODS_TYPE_ALL = 0; 9 | public static final Short GOODS_TYPE_CATEGORY = 1; 10 | public static final Short GOODS_TYPE_ARRAY = 2; 11 | 12 | public static final Short STATUS_NORMAL = 0; 13 | public static final Short STATUS_EXPIRED = 1; 14 | public static final Short STATUS_OUT = 2; 15 | 16 | public static final Short TIME_TYPE_DAYS = 0; 17 | public static final Short TIME_TYPE_TIME = 1; 18 | } 19 | -------------------------------------------------------------------------------- /litemall-admin/src/views/layout/components/Sidebar/FixiOSBug.js: -------------------------------------------------------------------------------- 1 | export default { 2 | computed: { 3 | device() { 4 | return this.$store.state.app.device 5 | } 6 | }, 7 | mounted() { 8 | // In order to fix the click on menu on the ios device will trigger the mouseeleave bug 9 | // https://github.com/PanJiaChen/vue-element-admin/issues/1135 10 | this.fixBugIniOS() 11 | }, 12 | methods: { 13 | fixBugIniOS() { 14 | const $submenu = this.$refs.submenu 15 | if ($submenu) { 16 | const handleMouseleave = $submenu.handleMouseleave 17 | $submenu.handleMouseleave = (e) => { 18 | if (this.device === 'mobile') { 19 | return 20 | } 21 | handleMouseleave(e) 22 | } 23 | } 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /litemall/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/config/WxWebMvcConfiguration.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.wx.config; 2 | 3 | import org.linlinjava.litemall.wx.annotation.support.LoginUserHandlerMethodArgumentResolver; 4 | import org.springframework.context.annotation.Configuration; 5 | import org.springframework.web.method.support.HandlerMethodArgumentResolver; 6 | import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; 7 | 8 | import java.util.List; 9 | 10 | @Configuration 11 | public class WxWebMvcConfiguration implements WebMvcConfigurer { 12 | @Override 13 | public void addArgumentResolvers(List argumentResolvers) { 14 | argumentResolvers.add(new LoginUserHandlerMethodArgumentResolver()); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /litemall-admin/src/api/ad.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export function listAd(query) { 4 | return request({ 5 | url: '/ad/list', 6 | method: 'get', 7 | params: query 8 | }) 9 | } 10 | 11 | export function createAd(data) { 12 | return request({ 13 | url: '/ad/create', 14 | method: 'post', 15 | data 16 | }) 17 | } 18 | 19 | export function readAd(data) { 20 | return request({ 21 | url: '/ad/read', 22 | method: 'get', 23 | data 24 | }) 25 | } 26 | 27 | export function updateAd(data) { 28 | return request({ 29 | url: '/ad/update', 30 | method: 'post', 31 | data 32 | }) 33 | } 34 | 35 | export function deleteAd(data) { 36 | return request({ 37 | url: '/ad/delete', 38 | method: 'post', 39 | data 40 | }) 41 | } 42 | -------------------------------------------------------------------------------- /litemall/litemall-core/src/test/java/org/linlinjava/litemall/core/AsyncTask.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.core; 2 | 3 | import org.apache.commons.logging.Log; 4 | import org.apache.commons.logging.LogFactory; 5 | import org.springframework.scheduling.annotation.Async; 6 | import org.springframework.stereotype.Service; 7 | 8 | @Service 9 | public class AsyncTask { 10 | private final Log logger = LogFactory.getLog(AsyncTask.class); 11 | 12 | @Async 13 | public void asyncMethod() { 14 | logger.info("Execute method asynchronously. " 15 | + Thread.currentThread().getName()); 16 | } 17 | 18 | public void nonasyncMethod() { 19 | logger.info("Execute method nonasynchronously. " 20 | + Thread.currentThread().getName()); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /litemall/litemall-all/src/main/java/org/linlinjava/litemall/Application.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall; 2 | 3 | import org.mybatis.spring.annotation.MapperScan; 4 | import org.springframework.boot.SpringApplication; 5 | import org.springframework.boot.autoconfigure.SpringBootApplication; 6 | import org.springframework.scheduling.annotation.EnableScheduling; 7 | import org.springframework.transaction.annotation.EnableTransactionManagement; 8 | 9 | @SpringBootApplication(scanBasePackages = {"org.linlinjava.litemall"}) 10 | @MapperScan("org.linlinjava.litemall.db.dao") 11 | @EnableTransactionManagement 12 | @EnableScheduling 13 | public class Application { 14 | 15 | public static void main(String[] args) throws Exception { 16 | SpringApplication.run(Application.class, args); 17 | } 18 | 19 | } -------------------------------------------------------------------------------- /litemall-admin/src/icons/svg/edit.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /litemall-admin/src/icons/svg/nested.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /litemall/litemall-db/src/main/resources/org/linlinjava/litemall/db/dao/GoodsProductMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | update litemall_goods_product 6 | set number = number + #{num,jdbcType=INTEGER}, update_time = now() 7 | where id = #{id,jdbcType=INTEGER} 8 | 9 | 10 | update litemall_goods_product 11 | set number = number - #{num,jdbcType=INTEGER}, update_time = now() 12 | where id = #{id,jdbcType=INTEGER} and number >= #{num,jdbcType=INTEGER} 13 | 14 | -------------------------------------------------------------------------------- /litemall-admin/src/api/brand.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export function listBrand(query) { 4 | return request({ 5 | url: '/brand/list', 6 | method: 'get', 7 | params: query 8 | }) 9 | } 10 | 11 | export function createBrand(data) { 12 | return request({ 13 | url: '/brand/create', 14 | method: 'post', 15 | data 16 | }) 17 | } 18 | 19 | export function readBrand(data) { 20 | return request({ 21 | url: '/brand/read', 22 | method: 'get', 23 | data 24 | }) 25 | } 26 | 27 | export function updateBrand(data) { 28 | return request({ 29 | url: '/brand/update', 30 | method: 'post', 31 | data 32 | }) 33 | } 34 | 35 | export function deleteBrand(data) { 36 | return request({ 37 | url: '/brand/delete', 38 | method: 'post', 39 | data 40 | }) 41 | } 42 | -------------------------------------------------------------------------------- /litemall-admin/src/api/issue.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export function listIssue(query) { 4 | return request({ 5 | url: '/issue/list', 6 | method: 'get', 7 | params: query 8 | }) 9 | } 10 | 11 | export function createIssue(data) { 12 | return request({ 13 | url: '/issue/create', 14 | method: 'post', 15 | data 16 | }) 17 | } 18 | 19 | export function readIssue(data) { 20 | return request({ 21 | url: '/issue/read', 22 | method: 'get', 23 | data 24 | }) 25 | } 26 | 27 | export function updateIssue(data) { 28 | return request({ 29 | url: '/issue/update', 30 | method: 'post', 31 | data 32 | }) 33 | } 34 | 35 | export function deleteIssue(data) { 36 | return request({ 37 | url: '/issue/delete', 38 | method: 'post', 39 | data 40 | }) 41 | } 42 | -------------------------------------------------------------------------------- /litemall/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/vo/CatVo.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.admin.vo; 2 | 3 | import java.util.List; 4 | 5 | public class CatVo { 6 | private Integer value = null; 7 | private String label = null; 8 | private List children = null; 9 | 10 | public Integer getValue() { 11 | return value; 12 | } 13 | 14 | public void setValue(Integer value) { 15 | this.value = value; 16 | } 17 | 18 | public String getLabel() { 19 | return label; 20 | } 21 | 22 | public void setLabel(String label) { 23 | this.label = label; 24 | } 25 | 26 | public List getChildren() { 27 | return children; 28 | } 29 | 30 | public void setChildren(List children) { 31 | this.children = children; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /litemall/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/vo/StatVo.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.admin.vo; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Arrays; 5 | import java.util.List; 6 | import java.util.Map; 7 | 8 | public class StatVo { 9 | private String[] columns = new String[0]; 10 | private List rows = new ArrayList<>(); 11 | 12 | public String[] getColumns() { 13 | return columns; 14 | } 15 | 16 | public void setColumns(String[] columns) { 17 | this.columns = columns; 18 | } 19 | 20 | public List getRows() { 21 | return rows; 22 | } 23 | 24 | public void setRows(List rows) { 25 | this.rows = rows; 26 | } 27 | 28 | public void add(Map... r) { 29 | rows.addAll(Arrays.asList(r)); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /litemall-admin/src/api/admin.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export function listAdmin(query) { 4 | return request({ 5 | url: '/admin/list', 6 | method: 'get', 7 | params: query 8 | }) 9 | } 10 | 11 | export function createAdmin(data) { 12 | return request({ 13 | url: '/admin/create', 14 | method: 'post', 15 | data 16 | }) 17 | } 18 | 19 | export function readminAdmin(data) { 20 | return request({ 21 | url: '/admin/readmin', 22 | method: 'get', 23 | data 24 | }) 25 | } 26 | 27 | export function updateAdmin(data) { 28 | return request({ 29 | url: '/admin/update', 30 | method: 'post', 31 | data 32 | }) 33 | } 34 | 35 | export function deleteAdmin(data) { 36 | return request({ 37 | url: '/admin/delete', 38 | method: 'post', 39 | data 40 | }) 41 | } 42 | -------------------------------------------------------------------------------- /litemall/litemall-core/src/main/java/org/linlinjava/litemall/core/validator/Order.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.core.validator; 2 | 3 | import javax.validation.Constraint; 4 | import javax.validation.Payload; 5 | import java.lang.annotation.Documented; 6 | import java.lang.annotation.Retention; 7 | import java.lang.annotation.Target; 8 | 9 | import static java.lang.annotation.ElementType.*; 10 | import static java.lang.annotation.RetentionPolicy.RUNTIME; 11 | 12 | @Target({METHOD, FIELD, PARAMETER}) 13 | @Retention(RUNTIME) 14 | @Documented 15 | @Constraint(validatedBy = OrderValidator.class) 16 | public @interface Order { 17 | String message() default "排序类型不支持"; 18 | 19 | String[] accepts() default {"desc", "asc"}; 20 | 21 | Class[] groups() default {}; 22 | 23 | Class[] payload() default {}; 24 | } 25 | -------------------------------------------------------------------------------- /litemall/litemall-core/src/main/java/org/linlinjava/litemall/core/validator/Sort.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.core.validator; 2 | 3 | import javax.validation.Constraint; 4 | import javax.validation.Payload; 5 | import java.lang.annotation.Documented; 6 | import java.lang.annotation.Retention; 7 | import java.lang.annotation.Target; 8 | 9 | import static java.lang.annotation.ElementType.*; 10 | import static java.lang.annotation.RetentionPolicy.RUNTIME; 11 | 12 | @Target({METHOD, FIELD, PARAMETER}) 13 | @Retention(RUNTIME) 14 | @Documented 15 | @Constraint(validatedBy = SortValidator.class) 16 | public @interface Sort { 17 | String message() default "排序字段不支持"; 18 | 19 | String[] accepts() default {"add_time", "id"}; 20 | 21 | Class[] groups() default {}; 22 | 23 | Class[] payload() default {}; 24 | } 25 | -------------------------------------------------------------------------------- /litemall-admin/src/directive/permission/permission.js: -------------------------------------------------------------------------------- 1 | 2 | import store from '@/store' 3 | 4 | export default{ 5 | inserted(el, binding, vnode) { 6 | const { value } = binding 7 | const perms = store.getters && store.getters.perms 8 | 9 | if (value && value instanceof Array && value.length > 0) { 10 | const permissions = value 11 | 12 | var hasPermission = false 13 | 14 | if (perms.indexOf('*') >= 0) { 15 | hasPermission = true 16 | } else { 17 | hasPermission = perms.some(perm => { 18 | return permissions.includes(perm) 19 | }) 20 | } 21 | 22 | if (!hasPermission) { 23 | el.parentNode && el.parentNode.removeChild(el) 24 | } 25 | } else { 26 | throw new Error(`need perms! Like v-permission="['GET /aaa','POST /bbb']"`) 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /litemall/docker/bin/reset.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # 本脚本的作用是重置部署环境 4 | # 1.重置数据库 5 | # 2.删除storage文件夹内文件 6 | # 3.调用deploy.sh启动服务 7 | # 注意:由于1和2的原因,请仅在开发测试阶段使用本脚本! 8 | 9 | # 重置数据库 10 | # i. 请在`XXXXXX`处设置相应的root密码 11 | # ii. 同时请注意root密码放在脚本是非常危险的,因此这里仅仅是用于开发测试阶段。 12 | ROOT=root 13 | PASSWORD=litemall123456 14 | 15 | if test -z "$PASSWORD" 16 | then 17 | echo "请设置云服务器MySQL的root账号密码" 18 | exit 1 19 | fi 20 | 21 | # 删除storage文件夹内文件 22 | cd /home/ubuntu/docker/litemall/storage || exit 2 23 | sudo rm -f ./** 24 | 25 | cd /home/ubuntu/docker || exit 3 26 | sudo docker-compose down 27 | sudo docker-compose build 28 | sudo docker image prune -f 29 | 30 | # 删除db/data文件夹内文件重置数据 31 | # 这样docker启动时会自动运行db/init-sql脚本,导入新的数据 32 | cd /home/ubuntu/docker/db/data || exit 1 33 | sudo rm -rf ./** 34 | 35 | cd /home/ubuntu/docker || exit 3 36 | sudo docker-compose up -d 37 | -------------------------------------------------------------------------------- /litemall/litemall-core/src/test/java/org/linlinjava/litemall/core/AsyncTest.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.core; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.boot.test.context.SpringBootTest; 7 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 8 | import org.springframework.test.context.junit4.SpringRunner; 9 | import org.springframework.test.context.web.WebAppConfiguration; 10 | 11 | /** 12 | * 异步测试 13 | */ 14 | @WebAppConfiguration 15 | @RunWith(SpringRunner.class) 16 | @SpringBootTest 17 | public class AsyncTest { 18 | 19 | @Autowired 20 | AsyncTask task; 21 | 22 | @Test 23 | public void test() { 24 | task.asyncMethod(); 25 | task.nonasyncMethod(); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /litemall-admin/src/api/keyword.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export function listKeyword(query) { 4 | return request({ 5 | url: '/keyword/list', 6 | method: 'get', 7 | params: query 8 | }) 9 | } 10 | 11 | export function createKeyword(data) { 12 | return request({ 13 | url: '/keyword/create', 14 | method: 'post', 15 | data 16 | }) 17 | } 18 | 19 | export function readKeyword(data) { 20 | return request({ 21 | url: '/keyword/read', 22 | method: 'get', 23 | data 24 | }) 25 | } 26 | 27 | export function updateKeyword(data) { 28 | return request({ 29 | url: '/keyword/update', 30 | method: 'post', 31 | data 32 | }) 33 | } 34 | 35 | export function deleteKeyword(data) { 36 | return request({ 37 | url: '/keyword/delete', 38 | method: 'post', 39 | data 40 | }) 41 | } 42 | -------------------------------------------------------------------------------- /litemall/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/Application.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.wx; 2 | 3 | import org.mybatis.spring.annotation.MapperScan; 4 | import org.springframework.boot.SpringApplication; 5 | import org.springframework.boot.autoconfigure.SpringBootApplication; 6 | import org.springframework.scheduling.annotation.EnableScheduling; 7 | import org.springframework.transaction.annotation.EnableTransactionManagement; 8 | 9 | @SpringBootApplication(scanBasePackages = {"org.linlinjava.litemall.db", "org.linlinjava.litemall.core", "org.linlinjava.litemall.wx"}) 10 | @MapperScan("org.linlinjava.litemall.db.dao") 11 | @EnableTransactionManagement 12 | @EnableScheduling 13 | public class Application { 14 | 15 | public static void main(String[] args) { 16 | SpringApplication.run(Application.class, args); 17 | } 18 | 19 | } -------------------------------------------------------------------------------- /litemall-admin/src/api/groupon.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export function listRecord(query) { 4 | return request({ 5 | url: '/groupon/listRecord', 6 | method: 'get', 7 | params: query 8 | }) 9 | } 10 | 11 | export function listGroupon(query) { 12 | return request({ 13 | url: '/groupon/list', 14 | method: 'get', 15 | params: query 16 | }) 17 | } 18 | 19 | export function deleteGroupon(data) { 20 | return request({ 21 | url: '/groupon/delete', 22 | method: 'post', 23 | data 24 | }) 25 | } 26 | 27 | export function publishGroupon(data) { 28 | return request({ 29 | url: '/groupon/create', 30 | method: 'post', 31 | data 32 | }) 33 | } 34 | 35 | export function editGroupon(data) { 36 | return request({ 37 | url: '/groupon/update', 38 | method: 'post', 39 | data 40 | }) 41 | } 42 | -------------------------------------------------------------------------------- /litemall-admin/src/utils/permission.js: -------------------------------------------------------------------------------- 1 | import store from '@/store' 2 | 3 | /** 4 | * @param {Array} value 5 | * @returns {Boolean} 6 | * @example see @/views/permission/directive.vue 7 | */ 8 | export default function checkPermission(value) { 9 | if (value && value instanceof Array && value.length > 0) { 10 | const perms = store.getters && store.getters.perms 11 | const permissions = value 12 | 13 | var hasPermission = false 14 | 15 | if (perms.indexOf('*') >= 0) { 16 | hasPermission = true 17 | } else { 18 | hasPermission = perms.some(perm => { 19 | return permissions.includes(perm) 20 | }) 21 | } 22 | 23 | if (!hasPermission) { 24 | return false 25 | } 26 | return true 27 | } else { 28 | console.error(`need perms! Like v-permission="['GET /aaa','POST /bbb']"`) 29 | return false 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /litemall-admin/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | moduleFileExtensions: ['js', 'jsx', 'json', 'vue'], 3 | transform: { 4 | '^.+\\.vue$': 'vue-jest', 5 | '.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$': 6 | 'jest-transform-stub', 7 | '^.+\\.jsx?$': 'babel-jest' 8 | }, 9 | moduleNameMapper: { 10 | '^@/(.*)$': '/src/$1' 11 | }, 12 | snapshotSerializers: ['jest-serializer-vue'], 13 | testMatch: [ 14 | '**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)' 15 | ], 16 | collectCoverageFrom: ['src/utils/**/*.{js,vue}', '!src/utils/auth.js', '!src/utils/request.js', 'src/components/**/*.{js,vue}'], 17 | coverageDirectory: '/tests/unit/coverage', 18 | // 'collectCoverage': true, 19 | 'coverageReporters': [ 20 | 'lcov', 21 | 'text-summary' 22 | ], 23 | testURL: 'http://localhost/' 24 | } 25 | -------------------------------------------------------------------------------- /litemall/.gitignore: -------------------------------------------------------------------------------- 1 | ### gradle ### 2 | .gradle 3 | /build/ 4 | !gradle/wrapper/gradle-wrapper.jar 5 | 6 | ### STS ### 7 | .settings/ 8 | .apt_generated 9 | .classpath 10 | .factorypath 11 | .project 12 | .settings 13 | .springBeans 14 | 15 | 16 | ### IntelliJ IDEA ### 17 | /.idea/ 18 | /private/ 19 | /storage/ 20 | /litemall.iml 21 | .checkstyle 22 | .idea 23 | *.iws 24 | *.iml 25 | *.ipr 26 | rebel.xml 27 | ### maven ### 28 | target/ 29 | *.war 30 | *.ear 31 | *.zip 32 | *.tar 33 | *.tar.gz 34 | 35 | ### logs #### 36 | /logs/ 37 | *.log 38 | 39 | ### temp ignore ### 40 | *.cache 41 | *.diff 42 | *.patch 43 | *.tmp 44 | *.java~ 45 | *.properties~ 46 | *.xml~ 47 | 48 | ### system ignore ### 49 | .DS_Store 50 | Thumbs.db 51 | Servers 52 | .metadata 53 | upload 54 | gen_code 55 | /litemall-core/src/main/resources/application-core.yml 56 | /litemall-db/src/main/resources/application-db.yml 57 | -------------------------------------------------------------------------------- /litemall/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/Application.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.admin; 2 | 3 | import org.mybatis.spring.annotation.MapperScan; 4 | import org.springframework.boot.SpringApplication; 5 | import org.springframework.boot.autoconfigure.SpringBootApplication; 6 | import org.springframework.scheduling.annotation.EnableScheduling; 7 | import org.springframework.transaction.annotation.EnableTransactionManagement; 8 | 9 | @SpringBootApplication(scanBasePackages = {"org.linlinjava.litemall.db", "org.linlinjava.litemall.core", 10 | "org.linlinjava.litemall.admin"}) 11 | @MapperScan("org.linlinjava.litemall.db.dao") 12 | @EnableTransactionManagement 13 | @EnableScheduling 14 | public class Application { 15 | 16 | public static void main(String[] args) { 17 | SpringApplication.run(Application.class, args); 18 | } 19 | 20 | } -------------------------------------------------------------------------------- /litemall-admin/src/views/layout/components/Sidebar/Link.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 43 | -------------------------------------------------------------------------------- /litemall/litemall-core/src/main/java/org/linlinjava/litemall/core/storage/Storage.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.core.storage; 2 | 3 | import org.springframework.core.io.Resource; 4 | 5 | import java.io.InputStream; 6 | import java.nio.file.Path; 7 | import java.util.stream.Stream; 8 | 9 | /** 10 | * 对象存储接口 11 | */ 12 | public interface Storage { 13 | 14 | /** 15 | * 存储一个文件对象 16 | * 17 | * @param inputStream 文件输入流 18 | * @param contentLength 文件长度 19 | * @param contentType 文件类型 20 | * @param keyName 文件名 21 | */ 22 | void store(InputStream inputStream, long contentLength, String contentType, String keyName); 23 | 24 | Stream loadAll(); 25 | 26 | Path load(String keyName); 27 | 28 | Resource loadAsResource(String keyName); 29 | 30 | void delete(String keyName); 31 | 32 | String generateUrl(String keyName); 33 | } -------------------------------------------------------------------------------- /litemall/litemall-core/src/main/java/org/linlinjava/litemall/core/util/BeanUtil.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.core.util; 2 | 3 | import org.springframework.beans.BeansException; 4 | import org.springframework.context.ApplicationContext; 5 | import org.springframework.context.ApplicationContextAware; 6 | import org.springframework.stereotype.Component; 7 | 8 | @Component 9 | public class BeanUtil implements ApplicationContextAware { 10 | protected static ApplicationContext context; 11 | 12 | @Override 13 | public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { 14 | context = applicationContext; 15 | } 16 | 17 | public static Object getBean(String name) { 18 | return context.getBean(name); 19 | } 20 | 21 | public static T getBean(Class c){ 22 | return context.getBean(c); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /litemall/litemall-db/src/test/java/org/linlinjava/litemall/db/DbConfigTest.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.db; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.boot.test.context.SpringBootTest; 7 | import org.springframework.core.env.Environment; 8 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 9 | import org.springframework.test.context.junit4.SpringRunner; 10 | import org.springframework.test.context.web.WebAppConfiguration; 11 | 12 | @WebAppConfiguration 13 | @RunWith(SpringRunner.class) 14 | @SpringBootTest 15 | public class DbConfigTest { 16 | @Autowired 17 | Environment environment; 18 | 19 | @Test 20 | public void test() { 21 | System.out.println(environment.getProperty("spring.datasource.druid.url")); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /litemall-admin/src/utils/clipboard.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Clipboard from 'clipboard' 3 | 4 | function clipboardSuccess() { 5 | Vue.prototype.$message({ 6 | message: '拷贝成功', 7 | type: 'success', 8 | duration: 1500 9 | }) 10 | } 11 | 12 | function clipboardError() { 13 | Vue.prototype.$message({ 14 | message: '拷贝失败', 15 | type: 'error' 16 | }) 17 | } 18 | 19 | export default function handleClipboard(text, event) { 20 | const clipboard = new Clipboard(event.target, { 21 | text: () => text 22 | }) 23 | clipboard.on('success', () => { 24 | clipboardSuccess() 25 | clipboard.off('error') 26 | clipboard.off('success') 27 | clipboard.destroy() 28 | }) 29 | clipboard.on('error', () => { 30 | clipboardError() 31 | clipboard.off('error') 32 | clipboard.off('success') 33 | clipboard.destroy() 34 | }) 35 | clipboard.onClick(event) 36 | } 37 | -------------------------------------------------------------------------------- /litemall-admin/src/views/layout/components/Sidebar/Item.vue: -------------------------------------------------------------------------------- 1 | 34 | 35 | 42 | -------------------------------------------------------------------------------- /litemall-admin/src/views/stat/goods.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 38 | -------------------------------------------------------------------------------- /litemall/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxIndexController.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.wx.web; 2 | 3 | import org.apache.commons.logging.Log; 4 | import org.apache.commons.logging.LogFactory; 5 | import org.linlinjava.litemall.core.util.ResponseUtil; 6 | import org.springframework.web.bind.annotation.GetMapping; 7 | import org.springframework.web.bind.annotation.RequestMapping; 8 | import org.springframework.web.bind.annotation.RestController; 9 | 10 | /** 11 | * 测试服务 12 | */ 13 | @RestController 14 | @RequestMapping("/wx/index") 15 | public class WxIndexController { 16 | private final Log logger = LogFactory.getLog(WxIndexController.class); 17 | 18 | /** 19 | * 测试数据 20 | * 21 | * @return 测试数据 22 | */ 23 | @GetMapping("/index") 24 | public Object index() { 25 | return ResponseUtil.ok("hello world, this is wx service"); 26 | } 27 | 28 | } -------------------------------------------------------------------------------- /litemall-admin/src/views/layout/components/Sidebar/index.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 34 | -------------------------------------------------------------------------------- /litemall-admin/src/views/stat/order.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 38 | -------------------------------------------------------------------------------- /litemall/litemall-core/src/main/java/org/linlinjava/litemall/core/config/ValidatorConfiguration.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.core.config; 2 | 3 | import org.hibernate.validator.HibernateValidator; 4 | import org.springframework.context.annotation.Bean; 5 | import org.springframework.context.annotation.Configuration; 6 | 7 | import javax.validation.Validation; 8 | import javax.validation.Validator; 9 | import javax.validation.ValidatorFactory; 10 | 11 | @Configuration 12 | public class ValidatorConfiguration { 13 | @Bean 14 | public Validator validator() { 15 | ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class) 16 | .configure() 17 | .addProperty("hibernate.validator.fail_fast", "true") 18 | .buildValidatorFactory(); 19 | Validator validator = validatorFactory.getValidator(); 20 | 21 | return validator; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /litemall/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/dto/CaptchaItem.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.wx.dto; 2 | 3 | import java.time.LocalDateTime; 4 | 5 | /** 6 | * 验证码实体类,用于缓存验证码发送 7 | */ 8 | public class CaptchaItem { 9 | private String phoneNumber; 10 | private String code; 11 | private LocalDateTime expireTime; 12 | 13 | public String getPhoneNumber() { 14 | return phoneNumber; 15 | } 16 | 17 | public void setPhoneNumber(String phoneNumber) { 18 | this.phoneNumber = phoneNumber; 19 | } 20 | 21 | public String getCode() { 22 | return code; 23 | } 24 | 25 | public void setCode(String code) { 26 | this.code = code; 27 | } 28 | 29 | public LocalDateTime getExpireTime() { 30 | return expireTime; 31 | } 32 | 33 | public void setExpireTime(LocalDateTime expireTime) { 34 | this.expireTime = expireTime; 35 | } 36 | } -------------------------------------------------------------------------------- /litemall-admin/src/icons/svg/eye.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /litemall/litemall-core/src/main/java/org/linlinjava/litemall/core/validator/SortValidator.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.core.validator; 2 | 3 | import com.google.common.collect.Lists; 4 | 5 | import javax.validation.ConstraintValidator; 6 | import javax.validation.ConstraintValidatorContext; 7 | import java.util.List; 8 | 9 | public class SortValidator implements ConstraintValidator { 10 | private List valueList; 11 | 12 | @Override 13 | public void initialize(Sort sort) { 14 | valueList = Lists.newArrayList(); 15 | for (String val : sort.accepts()) { 16 | valueList.add(val.toUpperCase()); 17 | } 18 | } 19 | 20 | @Override 21 | public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) { 22 | if (!valueList.contains(s.toUpperCase())) { 23 | return false; 24 | } 25 | return true; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /litemall-admin/src/styles/variables.scss: -------------------------------------------------------------------------------- 1 | // base color 2 | $blue:#324157; 3 | $light-blue:#3A71A8; 4 | $red:#C03639; 5 | $pink: #E65D6E; 6 | $green: #30B08F; 7 | $tiffany: #4AB7BD; 8 | $yellow:#FEC171; 9 | $panGreen: #30B08F; 10 | 11 | // sidebar 12 | $menuText:#bfcbd9; 13 | $menuActiveText:#409EFF; 14 | $subMenuActiveText:#f4f4f5; // https://github.com/ElemeFE/element/issues/12951 15 | 16 | $menuBg:#304156; 17 | $menuHover:#263445; 18 | 19 | $subMenuBg:#1f2d3d; 20 | $subMenuHover:#001528; 21 | 22 | $sideBarWidth: 210px; 23 | 24 | // the :export directive is the magic sauce for webpack 25 | // https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass 26 | :export { 27 | menuText: $menuText; 28 | menuActiveText: $menuActiveText; 29 | subMenuActiveText: $subMenuActiveText; 30 | menuBg: $menuBg; 31 | menuHover: $menuHover; 32 | subMenuBg: $subMenuBg; 33 | subMenuHover: $subMenuHover; 34 | sideBarWidth: $sideBarWidth; 35 | } 36 | -------------------------------------------------------------------------------- /litemall-admin/src/views/stat/user.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 39 | -------------------------------------------------------------------------------- /litemall/litemall-core/src/main/java/org/linlinjava/litemall/core/validator/OrderValidator.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.core.validator; 2 | 3 | import com.google.common.collect.Lists; 4 | 5 | import javax.validation.ConstraintValidator; 6 | import javax.validation.ConstraintValidatorContext; 7 | import java.util.List; 8 | 9 | public class OrderValidator implements ConstraintValidator { 10 | private List valueList; 11 | 12 | @Override 13 | public void initialize(Order order) { 14 | valueList = Lists.newArrayList(); 15 | for (String val : order.accepts()) { 16 | valueList.add(val.toUpperCase()); 17 | } 18 | } 19 | 20 | @Override 21 | public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) { 22 | if (!valueList.contains(s.toUpperCase())) { 23 | return false; 24 | } 25 | return true; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /litemall-admin/src/api/storage.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export function listStorage(query) { 4 | return request({ 5 | url: '/storage/list', 6 | method: 'get', 7 | params: query 8 | }) 9 | } 10 | 11 | export function createStorage(data) { 12 | return request({ 13 | url: '/storage/create', 14 | method: 'post', 15 | data 16 | }) 17 | } 18 | 19 | export function readStorage(data) { 20 | return request({ 21 | url: '/storage/read', 22 | method: 'get', 23 | data 24 | }) 25 | } 26 | 27 | export function updateStorage(data) { 28 | return request({ 29 | url: '/storage/update', 30 | method: 'post', 31 | data 32 | }) 33 | } 34 | 35 | export function deleteStorage(data) { 36 | return request({ 37 | url: '/storage/delete', 38 | method: 'post', 39 | data 40 | }) 41 | } 42 | 43 | const uploadPath = process.env.VUE_APP_BASE_API + '/storage/create' 44 | export { uploadPath } 45 | -------------------------------------------------------------------------------- /litemall-admin/src/styles/element-variables.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * I think element-ui's default theme color is too light for long-term use. 3 | * So I modified the default color and you can modify it to your liking. 4 | **/ 5 | 6 | /* theme color */ 7 | $--color-primary: #1890ff; 8 | $--color-success: #13ce66; 9 | $--color-warning: #ffba00; 10 | $--color-danger: #ff4949; 11 | // $--color-info: #1E1E1E; 12 | 13 | $--button-font-weight: 400; 14 | 15 | // $--color-text-regular: #1f2d3d; 16 | 17 | $--border-color-light: #dfe4ed; 18 | $--border-color-lighter: #e6ebf5; 19 | 20 | $--table-border: 1px solid #dfe6ec; 21 | 22 | /* icon font path, required */ 23 | $--font-path: "~element-ui/lib/theme-chalk/fonts"; 24 | 25 | @import "~element-ui/packages/theme-chalk/src/index"; 26 | 27 | // the :export directive is the magic sauce for webpack 28 | // https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass 29 | :export { 30 | theme: $--color-primary; 31 | } 32 | -------------------------------------------------------------------------------- /litemall-admin/src/styles/transition.scss: -------------------------------------------------------------------------------- 1 | // global transition css 2 | 3 | /* fade */ 4 | .fade-enter-active, 5 | .fade-leave-active { 6 | transition: opacity 0.28s; 7 | } 8 | 9 | .fade-enter, 10 | .fade-leave-active { 11 | opacity: 0; 12 | } 13 | 14 | /* fade-transform */ 15 | .fade-transform-leave-active, 16 | .fade-transform-enter-active { 17 | transition: all .5s; 18 | } 19 | 20 | .fade-transform-enter { 21 | opacity: 0; 22 | transform: translateX(-30px); 23 | } 24 | 25 | .fade-transform-leave-to { 26 | opacity: 0; 27 | transform: translateX(30px); 28 | } 29 | 30 | /* breadcrumb transition */ 31 | .breadcrumb-enter-active, 32 | .breadcrumb-leave-active { 33 | transition: all .5s; 34 | } 35 | 36 | .breadcrumb-enter, 37 | .breadcrumb-leave-active { 38 | opacity: 0; 39 | transform: translateX(20px); 40 | } 41 | 42 | .breadcrumb-move { 43 | transition: all .5s; 44 | } 45 | 46 | .breadcrumb-leave-active { 47 | position: absolute; 48 | } 49 | -------------------------------------------------------------------------------- /pcvue/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | GxShop 9 | 17 | 18 | 19 | 22 |
23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /litemall/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/service/UserInfoService.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.wx.service; 2 | 3 | import org.linlinjava.litemall.db.domain.LitemallUser; 4 | import org.linlinjava.litemall.db.service.LitemallUserService; 5 | import org.linlinjava.litemall.wx.dto.UserInfo; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.stereotype.Service; 8 | import org.springframework.util.Assert; 9 | 10 | @Service 11 | public class UserInfoService { 12 | @Autowired 13 | private LitemallUserService userService; 14 | 15 | 16 | public UserInfo getInfo(Integer userId) { 17 | LitemallUser user = userService.findById(userId); 18 | Assert.state(user != null, "用户不存在"); 19 | UserInfo userInfo = new UserInfo(); 20 | userInfo.setNickName(user.getNickname()); 21 | userInfo.setAvatarUrl(user.getAvatar()); 22 | return userInfo; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /litemall-admin/src/icons/svg/clipboard.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /litemall-admin/src/api/goods.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export function listGoods(query) { 4 | return request({ 5 | url: '/goods/list', 6 | method: 'get', 7 | params: query 8 | }) 9 | } 10 | 11 | export function deleteGoods(data) { 12 | return request({ 13 | url: '/goods/delete', 14 | method: 'post', 15 | data 16 | }) 17 | } 18 | 19 | export function publishGoods(data) { 20 | return request({ 21 | url: '/goods/create', 22 | method: 'post', 23 | data 24 | }) 25 | } 26 | 27 | export function detailGoods(id) { 28 | return request({ 29 | url: '/goods/detail', 30 | method: 'get', 31 | params: { id } 32 | }) 33 | } 34 | 35 | export function editGoods(data) { 36 | return request({ 37 | url: '/goods/update', 38 | method: 'post', 39 | data 40 | }) 41 | } 42 | 43 | export function listCatAndBrand() { 44 | return request({ 45 | url: '/goods/catAndBrand', 46 | method: 'get' 47 | }) 48 | } 49 | -------------------------------------------------------------------------------- /litemall/litemall-core/src/main/java/org/linlinjava/litemall/core/express/config/ExpressAutoConfiguration.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.core.express.config; 2 | 3 | import org.linlinjava.litemall.core.express.ExpressService; 4 | import org.springframework.boot.context.properties.EnableConfigurationProperties; 5 | import org.springframework.context.annotation.Bean; 6 | import org.springframework.context.annotation.Configuration; 7 | 8 | @Configuration 9 | @EnableConfigurationProperties(ExpressProperties.class) 10 | public class ExpressAutoConfiguration { 11 | 12 | private final ExpressProperties properties; 13 | 14 | public ExpressAutoConfiguration(ExpressProperties properties) { 15 | this.properties = properties; 16 | } 17 | 18 | @Bean 19 | public ExpressService expressService() { 20 | ExpressService expressService = new ExpressService(); 21 | expressService.setProperties(properties); 22 | return expressService; 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /litemall-admin/src/api/category.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export function listCategory(query) { 4 | return request({ 5 | url: '/category/list', 6 | method: 'get', 7 | params: query 8 | }) 9 | } 10 | 11 | export function listCatL1() { 12 | return request({ 13 | url: '/category/l1', 14 | method: 'get' 15 | }) 16 | } 17 | 18 | export function createCategory(data) { 19 | return request({ 20 | url: '/category/create', 21 | method: 'post', 22 | data 23 | }) 24 | } 25 | 26 | export function readCategory(data) { 27 | return request({ 28 | url: '/category/read', 29 | method: 'get', 30 | data 31 | }) 32 | } 33 | 34 | export function updateCategory(data) { 35 | return request({ 36 | url: '/category/update', 37 | method: 'post', 38 | data 39 | }) 40 | } 41 | 42 | export function deleteCategory(data) { 43 | return request({ 44 | url: '/category/delete', 45 | method: 'post', 46 | data 47 | }) 48 | } 49 | -------------------------------------------------------------------------------- /litemall-admin/src/api/topic.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export function listTopic(query) { 4 | return request({ 5 | url: '/topic/list', 6 | method: 'get', 7 | params: query 8 | }) 9 | } 10 | 11 | export function createTopic(data) { 12 | return request({ 13 | url: '/topic/create', 14 | method: 'post', 15 | data 16 | }) 17 | } 18 | 19 | export function readTopic(query) { 20 | return request({ 21 | url: '/topic/read', 22 | method: 'get', 23 | params: query 24 | }) 25 | } 26 | 27 | export function updateTopic(data) { 28 | return request({ 29 | url: '/topic/update', 30 | method: 'post', 31 | data 32 | }) 33 | } 34 | 35 | export function deleteTopic(data) { 36 | return request({ 37 | url: '/topic/delete', 38 | method: 'post', 39 | data 40 | }) 41 | } 42 | 43 | export function batchDeleteTopic(data) { 44 | return request({ 45 | url: '/topic/batch-delete', 46 | method: 'post', 47 | data 48 | }) 49 | } 50 | -------------------------------------------------------------------------------- /litemall/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/vo/PermVo.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.admin.vo; 2 | 3 | import java.util.List; 4 | 5 | public class PermVo { 6 | private String id; 7 | private String label; 8 | private String api; 9 | private List children; 10 | 11 | public String getId() { 12 | return id; 13 | } 14 | 15 | public void setId(String id) { 16 | this.id = id; 17 | } 18 | 19 | public String getLabel() { 20 | return label; 21 | } 22 | 23 | public void setLabel(String label) { 24 | this.label = label; 25 | } 26 | 27 | public void setApi(String api) { 28 | this.api = api; 29 | } 30 | 31 | public String getApi() { 32 | return api; 33 | } 34 | 35 | public List getChildren() { 36 | return children; 37 | } 38 | 39 | public void setChildren(List children) { 40 | this.children = children; 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /litemall/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/service/GetRegionService.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.wx.service; 2 | 3 | import org.linlinjava.litemall.db.domain.LitemallRegion; 4 | import org.linlinjava.litemall.db.service.LitemallRegionService; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.stereotype.Component; 7 | 8 | import java.util.List; 9 | 10 | /** 11 | * @author zhy 12 | * @date 2019-01-17 23:07 13 | **/ 14 | @Component 15 | public class GetRegionService { 16 | 17 | @Autowired 18 | private LitemallRegionService regionService; 19 | 20 | private static List litemallRegions; 21 | 22 | protected List getLitemallRegions() { 23 | if(litemallRegions==null){ 24 | createRegion(); 25 | } 26 | return litemallRegions; 27 | } 28 | 29 | private synchronized void createRegion(){ 30 | if (litemallRegions == null) { 31 | litemallRegions = regionService.getAll(); 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /litemall/litemall-core/src/main/java/org/linlinjava/litemall/core/express/dao/Traces.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2018 bejson.com 3 | */ 4 | package org.linlinjava.litemall.core.express.dao; 5 | 6 | import com.fasterxml.jackson.annotation.JsonProperty; 7 | 8 | /** 9 | * Auto-generated: 2018-07-19 22:27:22 10 | * 11 | * @author bejson.com (i@bejson.com) 12 | * @website http://www.bejson.com/java2pojo/ 13 | */ 14 | public class Traces { 15 | 16 | @JsonProperty("AcceptStation") 17 | private String AcceptStation; 18 | @JsonProperty("AcceptTime") 19 | private String AcceptTime; 20 | 21 | public String getAcceptStation() { 22 | return AcceptStation; 23 | } 24 | 25 | public void setAcceptStation(String AcceptStation) { 26 | this.AcceptStation = AcceptStation; 27 | } 28 | 29 | public String getAcceptTime() { 30 | return AcceptTime; 31 | } 32 | 33 | public void setAcceptTime(String AcceptTime) { 34 | this.AcceptTime = AcceptTime; 35 | } 36 | 37 | } -------------------------------------------------------------------------------- /litemall-admin/src/api/coupon.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export function listCoupon(query) { 4 | return request({ 5 | url: '/coupon/list', 6 | method: 'get', 7 | params: query 8 | }) 9 | } 10 | 11 | export function createCoupon(data) { 12 | return request({ 13 | url: '/coupon/create', 14 | method: 'post', 15 | data 16 | }) 17 | } 18 | 19 | export function readCoupon(id) { 20 | return request({ 21 | url: '/coupon/read', 22 | method: 'get', 23 | params: { id } 24 | }) 25 | } 26 | 27 | export function updateCoupon(data) { 28 | return request({ 29 | url: '/coupon/update', 30 | method: 'post', 31 | data 32 | }) 33 | } 34 | 35 | export function deleteCoupon(data) { 36 | return request({ 37 | url: '/coupon/delete', 38 | method: 'post', 39 | data 40 | }) 41 | } 42 | 43 | export function listCouponUser(query) { 44 | return request({ 45 | url: '/coupon/listuser', 46 | method: 'get', 47 | params: query 48 | }) 49 | } 50 | -------------------------------------------------------------------------------- /litemall-admin/src/api/notice.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export function listNotice(query) { 4 | return request({ 5 | url: '/notice/list', 6 | method: 'get', 7 | params: query 8 | }) 9 | } 10 | 11 | export function createNotice(data) { 12 | return request({ 13 | url: '/notice/create', 14 | method: 'post', 15 | data 16 | }) 17 | } 18 | 19 | export function readNotice(query) { 20 | return request({ 21 | url: '/notice/read', 22 | method: 'get', 23 | params: query 24 | }) 25 | } 26 | 27 | export function updateNotice(data) { 28 | return request({ 29 | url: '/notice/update', 30 | method: 'post', 31 | data 32 | }) 33 | } 34 | 35 | export function deleteNotice(data) { 36 | return request({ 37 | url: '/notice/delete', 38 | method: 'post', 39 | data 40 | }) 41 | } 42 | 43 | export function batchDeleteNotice(data) { 44 | return request({ 45 | url: '/notice/batch-delete', 46 | method: 'post', 47 | data 48 | }) 49 | } 50 | -------------------------------------------------------------------------------- /litemall-admin/src/icons/svg/list.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /litemall/docker/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | services: 3 | mysql57: 4 | image: mysql:5.7 5 | container_name: mysql 6 | ports: 7 | - "3306:3306" 8 | command: 9 | --character-set-server=utf8 10 | --collation-server=utf8_general_ci 11 | --default-authentication-plugin=mysql_native_password 12 | volumes: 13 | - ./db/conf.d:/etc/mysql/conf.d 14 | - ./db/data:/var/lib/mysql 15 | - ./db/init-sql:/docker-entrypoint-initdb.d 16 | environment: 17 | MYSQL_ROOT_PASSWORD: litemall123456 18 | restart: always 19 | litemall: 20 | build: 21 | context: litemall 22 | dockerfile: Dockerfile 23 | container_name: litemall 24 | ports: 25 | - "8080:8080" 26 | volumes: 27 | - ./litemall/storage:/storage 28 | - ./litemall/logs:/logs 29 | - ./litemall/backup:/backup 30 | - /etc/localtime:/etc/localtime 31 | environment: 32 | - TZ=Asia/Shanghai 33 | depends_on: 34 | - mysql57 35 | restart: always -------------------------------------------------------------------------------- /pcvue/src/components/home/public/shop_index_adv.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 36 | -------------------------------------------------------------------------------- /litemall/litemall-core/src/main/java/org/linlinjava/litemall/core/util/CharUtil.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.core.util; 2 | 3 | import java.util.Random; 4 | 5 | public class CharUtil { 6 | 7 | public static String getRandomString(Integer num) { 8 | String base = "abcdefghijklmnopqrstuvwxyz0123456789"; 9 | Random random = new Random(); 10 | StringBuffer sb = new StringBuffer(); 11 | for (int i = 0; i < num; i++) { 12 | int number = random.nextInt(base.length()); 13 | sb.append(base.charAt(number)); 14 | } 15 | return sb.toString(); 16 | } 17 | 18 | public static String getRandomNum(Integer num) { 19 | String base = "0123456789"; 20 | Random random = new Random(); 21 | StringBuffer sb = new StringBuffer(); 22 | for (int i = 0; i < num; i++) { 23 | int number = random.nextInt(base.length()); 24 | sb.append(base.charAt(number)); 25 | } 26 | return sb.toString(); 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /litemall/litemall-admin-api/src/test/java/org/linlinjava/litemall/admin/BcryptTest.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.admin; 2 | 3 | import org.junit.Assert; 4 | import org.junit.Test; 5 | import org.junit.runner.RunWith; 6 | import org.linlinjava.litemall.core.util.bcrypt.BCryptPasswordEncoder; 7 | import org.springframework.boot.test.context.SpringBootTest; 8 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 9 | 10 | @RunWith(SpringJUnit4ClassRunner.class) 11 | @SpringBootTest 12 | public class BcryptTest { 13 | 14 | @Test 15 | public void test() { 16 | String rawPassword = "aaaaaa"; 17 | String encodedPassword = ""; 18 | BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder(); 19 | encodedPassword = bCryptPasswordEncoder.encode(rawPassword); 20 | 21 | System.out.println("rawPassword=" + rawPassword + " encodedPassword=" + encodedPassword); 22 | 23 | Assert.assertTrue(bCryptPasswordEncoder.matches(rawPassword, encodedPassword)); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /litemall-admin/src/api/aftersale.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export function listAftersale(query) { 4 | return request({ 5 | url: '/aftersale/list', 6 | method: 'get', 7 | params: query 8 | }) 9 | } 10 | 11 | export function receptAftersale(data) { 12 | return request({ 13 | url: '/aftersale/recept', 14 | method: 'post', 15 | data 16 | }) 17 | } 18 | 19 | export function batchReceptAftersale(data) { 20 | return request({ 21 | url: '/aftersale/batch-recept', 22 | method: 'post', 23 | data 24 | }) 25 | } 26 | 27 | export function rejectAftersale(data) { 28 | return request({ 29 | url: '/aftersale/reject', 30 | method: 'post', 31 | data 32 | }) 33 | } 34 | 35 | export function batchRejectAftersale(data) { 36 | return request({ 37 | url: '/aftersale/batch-reject', 38 | method: 'post', 39 | data 40 | }) 41 | } 42 | 43 | export function refundAftersale(data) { 44 | return request({ 45 | url: '/aftersale/refund', 46 | method: 'post', 47 | data 48 | }) 49 | } 50 | -------------------------------------------------------------------------------- /litemall-admin/src/icons/svg/icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /litemall/litemall-core/src/test/java/org/linlinjava/litemall/core/CoreConfigTest.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.core; 2 | 3 | import org.apache.commons.logging.Log; 4 | import org.apache.commons.logging.LogFactory; 5 | import org.junit.Test; 6 | import org.junit.runner.RunWith; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.boot.test.context.SpringBootTest; 9 | import org.springframework.core.env.Environment; 10 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 11 | import org.springframework.test.context.junit4.SpringRunner; 12 | import org.springframework.test.context.web.WebAppConfiguration; 13 | 14 | @WebAppConfiguration 15 | @RunWith(SpringRunner.class) 16 | @SpringBootTest 17 | public class CoreConfigTest { 18 | private final Log logger = LogFactory.getLog(CoreConfigTest.class); 19 | @Autowired 20 | Environment environment; 21 | 22 | @Test 23 | public void test() { 24 | // 测试获取application-core.yml配置信息 25 | logger.info(environment.getProperty("litemall.express.appId")); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /litemall-admin/src/components/Screenfull/index.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 45 | 46 | 56 | -------------------------------------------------------------------------------- /litemall/litemall-db/src/main/resources/application-db.yml: -------------------------------------------------------------------------------- 1 | pagehelper: 2 | helperDialect: mysql 3 | reasonable: true 4 | supportMethodsArguments: true 5 | params: count=countSql 6 | 7 | spring: 8 | datasource: 9 | druid: 10 | url: jdbc:mysql://127.0.0.1:3306/litemall?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&verifyServerCertificate=false&useSSL=false 11 | driver-class-name: com.mysql.cj.jdbc.Driver 12 | username: ****** 13 | password: ****** 14 | initial-size: 10 15 | max-active: 50 16 | min-idle: 10 17 | max-wait: 60000 18 | pool-prepared-statements: true 19 | max-pool-prepared-statement-per-connection-size: 20 20 | validation-query: SELECT 1 FROM DUAL 21 | test-on-borrow: false 22 | test-on-return: false 23 | test-while-idle: true 24 | time-between-eviction-runs-millis: 60000 25 | webStatFilter: 26 | enabled: true 27 | statViewServlet: 28 | enabled: false 29 | filter: 30 | stat: 31 | enabled: false 32 | -------------------------------------------------------------------------------- /litemall-admin/src/icons/svg/international.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /litemall/deploy/util/package.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # 请注意 4 | # 本脚本的作用是把本项目编译的结果保存到deploy文件夹中 5 | # 1. 把项目数据库文件拷贝到deploy/db 6 | # 2. 编译litemall-admin 7 | # 3. 编译litemall-all模块,然后拷贝到deploy/litemall 8 | 9 | DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" 10 | cd $DIR/../.. 11 | LITEMALL_HOME=$PWD 12 | echo "LITEMALL_HOME $LITEMALL_HOME" 13 | 14 | # 复制数据库 15 | cat $LITEMALL_HOME/litemall-db/sql/litemall_schema.sql > $LITEMALL_HOME/deploy/db/litemall.sql 16 | cat $LITEMALL_HOME/litemall-db/sql/litemall_table.sql >> $LITEMALL_HOME/deploy/db/litemall.sql 17 | cat $LITEMALL_HOME/litemall-db/sql/litemall_data.sql >> $LITEMALL_HOME/deploy/db/litemall.sql 18 | 19 | # 安装阿里node镜像工具 20 | npm install -g cnpm --registry=https://registry.npm.taobao.org 21 | 22 | # 打包litemall-admin 23 | cd $LITEMALL_HOME/litemall-admin 24 | cnpm install 25 | cnpm run build:dep 26 | 27 | # 打包litemall-vue 28 | cd $LITEMALL_HOME/litemall-vue 29 | cnpm install 30 | cnpm run build:dep 31 | 32 | cd $LITEMALL_HOME 33 | mvn clean package 34 | cp -f $LITEMALL_HOME/litemall-all/target/litemall-all-*-exec.jar $LITEMALL_HOME/deploy/litemall/litemall.jar -------------------------------------------------------------------------------- /litemall/litemall-db/src/test/java/org/linlinjava/litemall/db/StockTest.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.db; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.linlinjava.litemall.db.dao.GoodsProductMapper; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.boot.test.context.SpringBootTest; 8 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 9 | import org.springframework.test.context.junit4.SpringRunner; 10 | import org.springframework.test.context.web.WebAppConfiguration; 11 | 12 | @WebAppConfiguration 13 | @RunWith(SpringRunner.class) 14 | @SpringBootTest 15 | public class StockTest { 16 | @Autowired 17 | private GoodsProductMapper goodsProductMapper; 18 | 19 | @Test 20 | public void testReduceStock() { 21 | Integer id = 1; 22 | Short num = 10; 23 | goodsProductMapper.reduceStock(id, num); 24 | } 25 | 26 | @Test 27 | public void testAddStock() { 28 | Integer id = 1; 29 | Short num = 10; 30 | goodsProductMapper.addStock(id, num); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /litemall-admin/src/main.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | 3 | import Cookies from 'js-cookie' 4 | 5 | import 'normalize.css/normalize.css' // A modern alternative to CSS resets 6 | 7 | import Element from 'element-ui' 8 | import './styles/element-variables.scss' 9 | 10 | import '@/styles/index.scss' // global css 11 | 12 | import App from './App' 13 | import store from './store' 14 | import router from './router' 15 | 16 | import './icons' // icon 17 | import './permission' // permission control 18 | 19 | import * as filters from './filters' // global filters 20 | 21 | import permission from '@/directive/permission/index.js' // 权限判断指令 22 | 23 | import Print from '@/utils/print' // 打印 24 | 25 | Vue.use(Print) 26 | 27 | Vue.use(Element, { 28 | size: Cookies.get('size') || 'medium' // set element-ui default size 29 | }) 30 | 31 | Vue.directive('permission', permission) 32 | 33 | // register global utility filters. 34 | Object.keys(filters).forEach(key => { 35 | Vue.filter(key, filters[key]) 36 | }) 37 | 38 | Vue.config.productionTip = false 39 | 40 | new Vue({ 41 | el: '#app', 42 | router, 43 | store, 44 | render: h => h(App) 45 | }) 46 | -------------------------------------------------------------------------------- /litemall-admin/src/api/profile.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export function changePassword(data) { 4 | return request({ 5 | url: '/profile/password', 6 | method: 'post', 7 | data 8 | }) 9 | } 10 | 11 | export function nNotice() { 12 | return request({ 13 | url: '/profile/nnotice', 14 | method: 'get' 15 | }) 16 | } 17 | 18 | export function listNotice(query) { 19 | return request({ 20 | url: '/profile/lsnotice', 21 | method: 'get', 22 | params: query 23 | }) 24 | } 25 | 26 | export function catNotice(data) { 27 | return request({ 28 | url: '/profile/catnotice', 29 | method: 'post', 30 | data 31 | }) 32 | } 33 | 34 | export function bcatNotice(data) { 35 | return request({ 36 | url: '/profile/bcatnotice', 37 | method: 'post', 38 | data 39 | }) 40 | } 41 | 42 | export function rmotice(data) { 43 | return request({ 44 | url: '/profile/rmnotice', 45 | method: 'post', 46 | data 47 | }) 48 | } 49 | 50 | export function brmNotice(data) { 51 | return request({ 52 | url: '/profile/brmnotice', 53 | method: 'post', 54 | data 55 | }) 56 | } 57 | 58 | -------------------------------------------------------------------------------- /litemall/docker/util/package.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # 请注意 4 | # 本脚本的作用是把本项目编译的结果保存到deploy文件夹中 5 | # 1. 把项目数据库文件拷贝到docker/db/init-sql 6 | # 2. 编译litemall-admin 7 | # 3. 编译litemall-all模块,然后拷贝到docker/litemall 8 | 9 | DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" 10 | cd $DIR/../.. 11 | LITEMALL_HOME=$PWD 12 | echo "LITEMALL_HOME $LITEMALL_HOME" 13 | 14 | # 复制数据库 15 | cat $LITEMALL_HOME/litemall-db/sql/litemall_schema.sql > $LITEMALL_HOME/docker/db/init-sql/litemall.sql 16 | cat $LITEMALL_HOME/litemall-db/sql/litemall_table.sql >> $LITEMALL_HOME/docker/db/init-sql/litemall.sql 17 | cat $LITEMALL_HOME/litemall-db/sql/litemall_data.sql >> $LITEMALL_HOME/docker/db/init-sql/litemall.sql 18 | 19 | # 安装阿里node镜像工具 20 | npm install -g cnpm --registry=https://registry.npm.taobao.org 21 | 22 | # 打包litemall-admin 23 | cd $LITEMALL_HOME/litemall-admin 24 | cnpm install 25 | cnpm run build:dep 26 | 27 | # 打包litemall-vue 28 | cd $LITEMALL_HOME/litemall-vue 29 | cnpm install 30 | cnpm run build:dep 31 | 32 | cd $LITEMALL_HOME 33 | mvn clean package 34 | cp -f $LITEMALL_HOME/litemall-all/target/litemall-all-*-exec.jar $LITEMALL_HOME/docker/litemall/litemall.jar -------------------------------------------------------------------------------- /litemall/litemall-admin-api/src/test/java/org/linlinjava/litemall/admin/CreateShareImageTest.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.admin; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.linlinjava.litemall.core.qcode.QCodeService; 6 | import org.linlinjava.litemall.db.domain.LitemallGoods; 7 | import org.linlinjava.litemall.db.service.LitemallGoodsService; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.boot.test.context.SpringBootTest; 10 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 11 | import org.springframework.test.context.web.WebAppConfiguration; 12 | 13 | @WebAppConfiguration 14 | @RunWith(SpringJUnit4ClassRunner.class) 15 | @SpringBootTest 16 | public class CreateShareImageTest { 17 | @Autowired 18 | QCodeService qCodeService; 19 | @Autowired 20 | LitemallGoodsService litemallGoodsService; 21 | 22 | @Test 23 | public void test() { 24 | LitemallGoods good = litemallGoodsService.findById(1181010); 25 | qCodeService.createGoodShareImage(good.getId().toString(), good.getPicUrl(), good.getName()); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /litemall/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 linlinjava(linlinjava@163.com) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /litemall/litemall-all-war/src/main/java/org/linlinjava/litemall/Application.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall; 2 | 3 | import org.mybatis.spring.annotation.MapperScan; 4 | import org.springframework.boot.SpringApplication; 5 | import org.springframework.boot.autoconfigure.SpringBootApplication; 6 | import org.springframework.boot.builder.SpringApplicationBuilder; 7 | import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; 8 | import org.springframework.scheduling.annotation.EnableScheduling; 9 | import org.springframework.transaction.annotation.EnableTransactionManagement; 10 | 11 | @SpringBootApplication(scanBasePackages = {"org.linlinjava.litemall"}) 12 | @MapperScan("org.linlinjava.litemall.db.dao") 13 | @EnableTransactionManagement 14 | @EnableScheduling 15 | public class Application extends SpringBootServletInitializer { 16 | 17 | public static void main(String[] args) throws Exception { 18 | SpringApplication.run(Application.class, args); 19 | } 20 | 21 | @Override 22 | protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { 23 | return builder.sources(Application.class); 24 | } 25 | } -------------------------------------------------------------------------------- /litemall-admin/src/components/Notice/index.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 43 | 44 | 55 | -------------------------------------------------------------------------------- /litemall-admin/src/icons/svg/wechat.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /litemall/deploy/util/lazy.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # 本脚本的作用是 4 | # 1. 项目打包 5 | # 2. 上传云服务器 6 | # 3. 远程登录云服务器并执行reset脚本 7 | 8 | # 请设置云服务器的IP地址和账户 9 | # 例如 ubuntu@122.51.199.160 10 | REMOTE= 11 | # 请设置本地SSH私钥文件id_rsa路径 12 | # 例如 /home/litemall/id_rsa 13 | ID_RSA= 14 | 15 | if test -z "$REMOTE" 16 | then 17 | echo "请设置云服务器登录IP地址和账户" 18 | exit 1 19 | fi 20 | 21 | if test -z "$ID_RSA" 22 | then 23 | echo "请设置云服务器登录IP地址和账户" 24 | exit 1 25 | fi 26 | 27 | DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" 28 | cd $DIR/../.. || exit 2 29 | LITEMALL_HOME=$PWD 30 | echo "LITEMALL_HOME $LITEMALL_HOME" 31 | 32 | # 项目打包 33 | cd $LITEMALL_HOME || exit 2 34 | ./deploy/util/package.sh 35 | 36 | # 上传云服务器 37 | cd $LITEMALL_HOME || exit 2 38 | scp -i $ID_RSA -r ./deploy $REMOTE:/home/ubuntu/ 39 | 40 | # 远程登录云服务器并执行reset脚本 41 | # 这里使用tr命令,因为有可能deploy.sh和reset.sh的换行格式是CRLF,而LINUX环境应该是LF 42 | ssh $REMOTE -i $ID_RSA << eeooff 43 | cd /home/ubuntu/deploy/bin 44 | cat deploy.sh | tr -d '\r' > deploy2.sh 45 | mv deploy2.sh deploy.sh 46 | chmod +x deploy.sh 47 | cat reset.sh | tr -d '\r' > reset2.sh 48 | mv reset2.sh reset.sh 49 | chmod +x reset.sh 50 | sudo ./reset.sh 51 | exit 52 | eeooff -------------------------------------------------------------------------------- /litemall-admin/src/views/layout/mixin/ResizeHandler.js: -------------------------------------------------------------------------------- 1 | import store from '@/store' 2 | 3 | const { body } = document 4 | const WIDTH = 1024 5 | const RATIO = 3 6 | 7 | export default { 8 | watch: { 9 | $route(route) { 10 | if (this.device === 'mobile' && this.sidebar.opened) { 11 | store.dispatch('closeSideBar', { withoutAnimation: false }) 12 | } 13 | } 14 | }, 15 | beforeMount() { 16 | window.addEventListener('resize', this.resizeHandler) 17 | }, 18 | mounted() { 19 | const isMobile = this.isMobile() 20 | if (isMobile) { 21 | store.dispatch('toggleDevice', 'mobile') 22 | store.dispatch('closeSideBar', { withoutAnimation: true }) 23 | } 24 | }, 25 | methods: { 26 | isMobile() { 27 | const rect = body.getBoundingClientRect() 28 | return rect.width - RATIO < WIDTH 29 | }, 30 | resizeHandler() { 31 | if (!document.hidden) { 32 | const isMobile = this.isMobile() 33 | store.dispatch('toggleDevice', isMobile ? 'mobile' : 'desktop') 34 | 35 | if (isMobile) { 36 | store.dispatch('closeSideBar', { withoutAnimation: true }) 37 | } 38 | } 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /litemall-admin/src/api/config.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export function listMall() { 4 | return request({ 5 | url: '/config/mall', 6 | method: 'get' 7 | }) 8 | } 9 | 10 | export function updateMall(data) { 11 | return request({ 12 | url: '/config/mall', 13 | method: 'post', 14 | data 15 | }) 16 | } 17 | 18 | export function listExpress() { 19 | return request({ 20 | url: '/config/express', 21 | method: 'get' 22 | }) 23 | } 24 | 25 | export function updateExpress(data) { 26 | return request({ 27 | url: '/config/express', 28 | method: 'post', 29 | data 30 | }) 31 | } 32 | 33 | export function listOrder() { 34 | return request({ 35 | url: '/config/order', 36 | method: 'get' 37 | }) 38 | } 39 | 40 | export function updateOrder(data) { 41 | return request({ 42 | url: '/config/order', 43 | method: 'post', 44 | data 45 | }) 46 | } 47 | 48 | export function listWx() { 49 | return request({ 50 | url: '/config/wx', 51 | method: 'get' 52 | }) 53 | } 54 | 55 | export function updateWx(data) { 56 | return request({ 57 | url: '/config/wx', 58 | method: 'post', 59 | data 60 | }) 61 | } 62 | -------------------------------------------------------------------------------- /litemall-admin/src/icons/svg/people.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /litemall/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/util/Permission.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.admin.util; 2 | 3 | import org.apache.shiro.authz.annotation.RequiresPermissions; 4 | import org.linlinjava.litemall.admin.annotation.RequiresPermissionsDesc; 5 | 6 | public class Permission { 7 | private RequiresPermissions requiresPermissions; 8 | private RequiresPermissionsDesc requiresPermissionsDesc; 9 | private String api; 10 | 11 | public RequiresPermissions getRequiresPermissions() { 12 | return requiresPermissions; 13 | } 14 | 15 | public RequiresPermissionsDesc getRequiresPermissionsDesc() { 16 | return requiresPermissionsDesc; 17 | } 18 | 19 | public void setRequiresPermissions(RequiresPermissions requiresPermissions) { 20 | this.requiresPermissions = requiresPermissions; 21 | } 22 | 23 | public void setRequiresPermissionsDesc(RequiresPermissionsDesc requiresPermissionsDesc) { 24 | this.requiresPermissionsDesc = requiresPermissionsDesc; 25 | } 26 | 27 | public String getApi() { 28 | return api; 29 | } 30 | 31 | public void setApi(String api) { 32 | this.api = api; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /litemall/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/vo/RegionVo.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.admin.vo; 2 | 3 | import java.util.List; 4 | 5 | public class RegionVo { 6 | private Integer id; 7 | private String name; 8 | private Byte type; 9 | private Integer code; 10 | 11 | private List children; 12 | 13 | public Integer getId() { 14 | return id; 15 | } 16 | 17 | public void setId(Integer id) { 18 | this.id = id; 19 | } 20 | 21 | public List getChildren() { 22 | return children; 23 | } 24 | 25 | public String getName() { 26 | return name; 27 | } 28 | 29 | public void setName(String name) { 30 | this.name = name; 31 | } 32 | 33 | public Byte getType() { 34 | return type; 35 | } 36 | 37 | public void setType(Byte type) { 38 | this.type = type; 39 | } 40 | 41 | public Integer getCode() { 42 | return code; 43 | } 44 | 45 | public void setCode(Integer code) { 46 | this.code = code; 47 | } 48 | 49 | public void setChildren(List children) { 50 | this.children = children; 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /litemall/docker/util/lazy.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # 本脚本的作用是 4 | # 1. 项目打包 5 | # 2. 上传云服务器 6 | # 3. 远程登录云服务器并执行reset脚本 7 | 8 | # 请设置云服务器的IP地址和账户 9 | # 例如 ubuntu@122.51.199.160 10 | REMOTE=ubuntu@122.51.199.160 11 | # 请设置本地SSH私钥文件id_rsa路径 12 | # 例如 /home/litemall/id_rsa 13 | ID_RSA=/d/00/cloud/litemall.txt 14 | 15 | if test -z "$REMOTE" 16 | then 17 | echo "请设置云服务器登录IP地址和账户" 18 | exit 1 19 | fi 20 | 21 | if test -z "$ID_RSA" 22 | then 23 | echo "请设置云服务器登录IP地址和账户" 24 | exit 1 25 | fi 26 | 27 | DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" 28 | cd $DIR/../.. || exit 2 29 | LITEMALL_HOME=$PWD 30 | echo "LITEMALL_HOME $LITEMALL_HOME" 31 | 32 | # 项目打包 33 | cd $LITEMALL_HOME || exit 2 34 | ./docker/util/package.sh 35 | 36 | # 上传云服务器 37 | cd $LITEMALL_HOME || exit 2 38 | scp -i $ID_RSA -r ./docker $REMOTE:/home/ubuntu/ 39 | 40 | # 远程登录云服务器并执行reset脚本 41 | # 这里使用tr命令,因为有可能deploy.sh和reset.sh的换行格式是CRLF,而LINUX环境应该是LF 42 | ssh $REMOTE -i $ID_RSA << eeooff 43 | cd /home/ubuntu/docker/bin 44 | cat deploy.sh | tr -d '\r' > deploy2.sh 45 | mv deploy2.sh deploy.sh 46 | chmod +x deploy.sh 47 | cat reset.sh | tr -d '\r' > reset2.sh 48 | mv reset2.sh reset.sh 49 | chmod +x reset.sh 50 | sudo ./reset.sh 51 | exit 52 | eeooff -------------------------------------------------------------------------------- /litemall-admin/src/views/layout/components/AppMain.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 24 | 25 | 46 | 47 | 55 | 56 | -------------------------------------------------------------------------------- /litemall-admin/src/icons/svg/language.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /litemall/litemall-admin-api/src/test/java/org/linlinjava/litemall/admin/AdminConfigTest.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.admin; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.boot.test.context.SpringBootTest; 7 | import org.springframework.core.env.Environment; 8 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 9 | import org.springframework.test.context.web.WebAppConfiguration; 10 | 11 | @WebAppConfiguration 12 | @RunWith(SpringJUnit4ClassRunner.class) 13 | @SpringBootTest 14 | public class AdminConfigTest { 15 | @Autowired 16 | private Environment environment; 17 | 18 | @Test 19 | public void test() { 20 | // 测试获取application-core.yml配置信息 21 | System.out.println(environment.getProperty("litemall.express.appId")); 22 | // 测试获取application-db.yml配置信息 23 | System.out.println(environment.getProperty("spring.datasource.druid.url")); 24 | // 测试获取application-admin.yml配置信息 25 | // System.out.println(environment.getProperty("")); 26 | // 测试获取application.yml配置信息 27 | System.out.println(environment.getProperty("logging.level.org.linlinjava.litemall.admin")); 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /pcvue/src/views/Home/store/index.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 39 | -------------------------------------------------------------------------------- /litemall-admin/src/utils/openWindow.js: -------------------------------------------------------------------------------- 1 | /** 2 | *Created by jiachenpan on 16/11/29. 3 | * @param {Sting} url 4 | * @param {Sting} title 5 | * @param {Number} w 6 | * @param {Number} h 7 | */ 8 | 9 | export default function openWindow(url, title, w, h) { 10 | // Fixes dual-screen position Most browsers Firefox 11 | const dualScreenLeft = window.screenLeft !== undefined ? window.screenLeft : screen.left 12 | const dualScreenTop = window.screenTop !== undefined ? window.screenTop : screen.top 13 | 14 | const width = window.innerWidth ? window.innerWidth : document.documentElement.clientWidth ? document.documentElement.clientWidth : screen.width 15 | const height = window.innerHeight ? window.innerHeight : document.documentElement.clientHeight ? document.documentElement.clientHeight : screen.height 16 | 17 | const left = ((width / 2) - (w / 2)) + dualScreenLeft 18 | const top = ((height / 2) - (h / 2)) + dualScreenTop 19 | const newWindow = window.open(url, title, 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=yes, copyhistory=no, width=' + w + ', height=' + h + ', top=' + top + ', left=' + left) 20 | 21 | // Puts focus on the newWindow 22 | if (window.focus) { 23 | newWindow.focus() 24 | } 25 | } 26 | 27 | -------------------------------------------------------------------------------- /litemall/litemall-admin-api/src/test/java/org/linlinjava/litemall/admin/PermissionTest.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.admin; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.linlinjava.litemall.admin.util.Permission; 6 | import org.linlinjava.litemall.admin.util.PermissionUtil; 7 | import org.linlinjava.litemall.admin.vo.PermVo; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.boot.test.context.SpringBootTest; 10 | import org.springframework.context.ApplicationContext; 11 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 12 | import org.springframework.test.context.web.WebAppConfiguration; 13 | 14 | import java.util.List; 15 | 16 | @WebAppConfiguration 17 | @RunWith(SpringJUnit4ClassRunner.class) 18 | @SpringBootTest 19 | public class PermissionTest { 20 | 21 | @Autowired 22 | private ApplicationContext context; 23 | 24 | @Test 25 | public void test() { 26 | final String basicPackage = "org.linlinjava.litemall.admin"; 27 | List permissionList = PermissionUtil.listPermission(context, basicPackage); 28 | List permVoList = PermissionUtil.listPermVo(permissionList); 29 | permVoList.stream().forEach(System.out::println); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /litemall-admin/src/api/role.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export function listRole(query) { 4 | return request({ 5 | url: '/role/list', 6 | method: 'get', 7 | params: query 8 | }) 9 | } 10 | 11 | export function createRole(data) { 12 | return request({ 13 | url: '/role/create', 14 | method: 'post', 15 | data 16 | }) 17 | } 18 | 19 | export function readRole(data) { 20 | return request({ 21 | url: '/role/read', 22 | method: 'get', 23 | data 24 | }) 25 | } 26 | 27 | export function updateRole(data) { 28 | return request({ 29 | url: '/role/update', 30 | method: 'post', 31 | data 32 | }) 33 | } 34 | 35 | export function deleteRole(data) { 36 | return request({ 37 | url: '/role/delete', 38 | method: 'post', 39 | data 40 | }) 41 | } 42 | 43 | export function getPermission(query) { 44 | return request({ 45 | url: '/role/permissions', 46 | method: 'get', 47 | params: query 48 | }) 49 | } 50 | 51 | export function updatePermission(data) { 52 | return request({ 53 | url: '/role/permissions', 54 | method: 'post', 55 | data 56 | }) 57 | } 58 | 59 | export function roleOptions(query) { 60 | return request({ 61 | url: '/role/options', 62 | method: 'get', 63 | params: query 64 | }) 65 | } 66 | -------------------------------------------------------------------------------- /pcvue/src/views/Home/store/store_goods_list.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 39 | -------------------------------------------------------------------------------- /litemall/litemall-db/src/main/resources/org/linlinjava/litemall/db/dao/StatMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 22 | 31 | 32 | -------------------------------------------------------------------------------- /litemall/litemall-core/src/main/java/org/linlinjava/litemall/core/express/config/ExpressProperties.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.core.express.config; 2 | 3 | import org.springframework.boot.context.properties.ConfigurationProperties; 4 | 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | import java.util.Map; 8 | 9 | @ConfigurationProperties(prefix = "litemall.express") 10 | public class ExpressProperties { 11 | private boolean enable; 12 | private String appId; 13 | private String appKey; 14 | private List> vendors = new ArrayList<>(); 15 | 16 | public boolean isEnable() { 17 | return enable; 18 | } 19 | 20 | public void setEnable(boolean enable) { 21 | this.enable = enable; 22 | } 23 | 24 | public List> getVendors() { 25 | return vendors; 26 | } 27 | 28 | public void setVendors(List> vendors) { 29 | this.vendors = vendors; 30 | } 31 | 32 | public String getAppKey() { 33 | return appKey; 34 | } 35 | 36 | public void setAppKey(String appKey) { 37 | this.appKey = appKey; 38 | } 39 | 40 | public String getAppId() { 41 | return appId; 42 | } 43 | 44 | public void setAppId(String appId) { 45 | this.appId = appId; 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /litemall/litemall-core/src/main/java/org/linlinjava/litemall/core/task/TaskService.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.core.task; 2 | 3 | import org.springframework.stereotype.Component; 4 | import javax.annotation.PostConstruct; 5 | import java.util.concurrent.DelayQueue; 6 | import java.util.concurrent.Executors; 7 | 8 | @Component 9 | public class TaskService { 10 | private TaskService taskService; 11 | private DelayQueue delayQueue = new DelayQueue(); 12 | 13 | @PostConstruct 14 | private void init() { 15 | taskService = this; 16 | 17 | Executors.newSingleThreadExecutor().execute(new Runnable() { 18 | @Override 19 | public void run() { 20 | while (true) { 21 | try { 22 | Task task = delayQueue.take(); 23 | task.run(); 24 | } catch (Exception e) { 25 | e.printStackTrace(); 26 | } 27 | } 28 | } 29 | }); 30 | } 31 | 32 | public void addTask(Task task){ 33 | if(delayQueue.contains(task)){ 34 | return; 35 | } 36 | delayQueue.add(task); 37 | } 38 | 39 | public void removeTask(Task task){ 40 | delayQueue.remove(task); 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /litemall-admin/src/api/user.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export function fetchList(query) { 4 | return request({ 5 | url: '/user/list', 6 | method: 'get', 7 | params: query 8 | }) 9 | } 10 | 11 | export function userDetail(id) { 12 | return request({ 13 | url: '/user/detail', 14 | method: 'get', 15 | params: {id} 16 | }) 17 | } 18 | 19 | export function updateUser(data) { 20 | return request({ 21 | url: '/user/update', 22 | method: 'post', 23 | data 24 | }) 25 | } 26 | 27 | export function listAddress(query) { 28 | return request({ 29 | url: '/address/list', 30 | method: 'get', 31 | params: query 32 | }) 33 | } 34 | 35 | export function listCollect(query) { 36 | return request({ 37 | url: '/collect/list', 38 | method: 'get', 39 | params: query 40 | }) 41 | } 42 | 43 | export function listFeedback(query) { 44 | return request({ 45 | url: '/feedback/list', 46 | method: 'get', 47 | params: query 48 | }) 49 | } 50 | 51 | export function listFootprint(query) { 52 | return request({ 53 | url: '/footprint/list', 54 | method: 'get', 55 | params: query 56 | }) 57 | } 58 | 59 | export function listHistory(query) { 60 | return request({ 61 | url: '/history/list', 62 | method: 'get', 63 | params: query 64 | }) 65 | } 66 | -------------------------------------------------------------------------------- /litemall/litemall-core/src/main/java/org/linlinjava/litemall/core/config/CorsConfig.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.core.config; 2 | 3 | import org.springframework.context.annotation.Bean; 4 | import org.springframework.context.annotation.Configuration; 5 | import org.springframework.web.cors.CorsConfiguration; 6 | import org.springframework.web.cors.UrlBasedCorsConfigurationSource; 7 | import org.springframework.web.filter.CorsFilter; 8 | 9 | @Configuration 10 | public class CorsConfig { 11 | // 当前跨域请求最大有效时长。这里默认30天 12 | private long maxAge = 30 * 24 * 60 * 60; 13 | 14 | private CorsConfiguration buildConfig() { 15 | CorsConfiguration corsConfiguration = new CorsConfiguration(); 16 | corsConfiguration.addAllowedOrigin("*"); // 1 设置访问源地址 17 | corsConfiguration.addAllowedHeader("*"); // 2 设置访问源请求头 18 | corsConfiguration.addAllowedMethod("*"); // 3 设置访问源请求方法 19 | corsConfiguration.setMaxAge(maxAge); 20 | corsConfiguration.setAllowCredentials(true); 21 | return corsConfiguration; 22 | } 23 | 24 | @Bean 25 | public CorsFilter corsFilter() { 26 | UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); 27 | source.registerCorsConfiguration("/**", buildConfig()); // 4 对接口配置跨域设置 28 | return new CorsFilter(source); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /litemall/litemall-core/src/test/java/org/linlinjava/litemall/core/ExpressTest.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.core; 2 | 3 | import org.apache.commons.logging.Log; 4 | import org.apache.commons.logging.LogFactory; 5 | import org.junit.Test; 6 | import org.junit.runner.RunWith; 7 | import org.linlinjava.litemall.core.express.ExpressService; 8 | import org.linlinjava.litemall.core.express.dao.ExpressInfo; 9 | import org.springframework.beans.factory.annotation.Autowired; 10 | import org.springframework.boot.test.context.SpringBootTest; 11 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 12 | import org.springframework.test.context.junit4.SpringRunner; 13 | import org.springframework.test.context.web.WebAppConfiguration; 14 | 15 | @WebAppConfiguration 16 | @RunWith(SpringRunner.class) 17 | @SpringBootTest(classes = Application.class) 18 | public class ExpressTest { 19 | 20 | private final Log logger = LogFactory.getLog(ExpressTest.class); 21 | @Autowired 22 | private ExpressService expressService; 23 | 24 | @Test 25 | public void test() { 26 | ExpressInfo ei = null; 27 | try { 28 | ei = expressService.getExpressInfo("STO", "773084173565332"); 29 | } catch (Exception e) { 30 | logger.error(e.getMessage(), e); 31 | } 32 | logger.info(ei); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /litemall/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/dto/UserToken.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.wx.dto; 2 | 3 | import java.time.LocalDateTime; 4 | 5 | public class UserToken { 6 | private Integer userId; 7 | private String token; 8 | private String sessionKey; 9 | private LocalDateTime expireTime; 10 | private LocalDateTime updateTime; 11 | 12 | public String getSessionKey() { 13 | return sessionKey; 14 | } 15 | 16 | public void setSessionKey(String sessionKey) { 17 | this.sessionKey = sessionKey; 18 | } 19 | 20 | public Integer getUserId() { 21 | return userId; 22 | } 23 | 24 | public void setUserId(Integer userId) { 25 | this.userId = userId; 26 | } 27 | 28 | public String getToken() { 29 | return token; 30 | } 31 | 32 | public void setToken(String token) { 33 | this.token = token; 34 | } 35 | 36 | public LocalDateTime getExpireTime() { 37 | return expireTime; 38 | } 39 | 40 | public void setExpireTime(LocalDateTime expireTime) { 41 | this.expireTime = expireTime; 42 | } 43 | 44 | public LocalDateTime getUpdateTime() { 45 | return updateTime; 46 | } 47 | 48 | public void setUpdateTime(LocalDateTime updateTime) { 49 | this.updateTime = updateTime; 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /litemall/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/config/KaptchaConfig.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.admin.config; 2 | 3 | import com.google.code.kaptcha.Producer; 4 | import com.google.code.kaptcha.impl.DefaultKaptcha; 5 | import com.google.code.kaptcha.util.Config; 6 | import org.springframework.context.annotation.Bean; 7 | import org.springframework.context.annotation.Configuration; 8 | 9 | import java.util.Properties; 10 | 11 | @Configuration 12 | public class KaptchaConfig { 13 | 14 | @Bean 15 | public Producer kaptchaProducer() { 16 | Properties properties = new Properties(); 17 | properties.setProperty("kaptcha.image.width", "100"); 18 | properties.setProperty("kaptcha.image.height", "40"); 19 | properties.setProperty("kaptcha.textproducer.font.size", "32"); 20 | properties.setProperty("kaptcha.textproducer.font.color", "0,0,0"); 21 | properties.setProperty("kaptcha.textproducer.char.string", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYAZ"); 22 | properties.setProperty("kaptcha.textproducer.char.length", "4"); 23 | properties.setProperty("kaptcha.noise.impl", "com.google.code.kaptcha.impl.NoNoise"); 24 | 25 | DefaultKaptcha kaptcha = new DefaultKaptcha(); 26 | Config config = new Config(properties); 27 | kaptcha.setConfig(config); 28 | return kaptcha; 29 | } 30 | 31 | } -------------------------------------------------------------------------------- /litemall/litemall-wx-api/src/test/java/org/linlinjava/litemall/wx/WxConfigTest.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.wx; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.boot.test.context.SpringBootTest; 7 | import org.springframework.core.env.Environment; 8 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 9 | import org.springframework.test.context.web.WebAppConfiguration; 10 | 11 | @WebAppConfiguration 12 | @RunWith(SpringJUnit4ClassRunner.class) 13 | @SpringBootTest 14 | public class WxConfigTest { 15 | @Autowired 16 | private Environment environment; 17 | 18 | @Test 19 | public void test() { 20 | // 测试获取application-core.yml配置信息 21 | System.out.println(environment.getProperty("litemall.express.appId")); 22 | // 测试获取application-db.yml配置信息 23 | System.out.println(environment.getProperty("spring.datasource.druid.url")); 24 | // 测试获取application-wx.yml配置信息 25 | System.out.println(environment.getProperty("litemall.wx.app-id")); 26 | // 测试获取application-wx.yml配置信息 27 | System.out.println(environment.getProperty("litemall.wx.notify-url")); 28 | // 测试获取application.yml配置信息 29 | System.out.println(environment.getProperty("logging.level.org.linlinjava.litemall.wx")); 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /pcvue/src/components/home/public/banner.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 34 | -------------------------------------------------------------------------------- /pcvue/src/plugins/function.js: -------------------------------------------------------------------------------- 1 | export function formatDate (date, fmt) { 2 | if (/(y+)/.test(fmt)) { 3 | fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length)); 4 | } 5 | let o = { 6 | 'M+': date.getMonth() + 1, 7 | 'd+': date.getDate(), 8 | 'h+': date.getHours(), 9 | 'm+': date.getMinutes(), 10 | 's+': date.getSeconds() 11 | }; 12 | for (let k in o) { 13 | if (new RegExp(`(${k})`).test(fmt)) { 14 | let str = o[k] + ''; 15 | fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? str : padLeftZero(str)); 16 | } 17 | } 18 | return fmt; 19 | } 20 | 21 | function padLeftZero (str) { 22 | return ('00' + str).substr(str.length); 23 | } 24 | 25 | 26 | // 产品数据格式化 27 | export function formatGoods (data) { 28 | data.forEach(res=>{ 29 | if(res.spec != undefined && res.spec.length != 0 && res.spec != null && res.spec !=''){ 30 | res.goods_price = res.spec[0]['goods_price']; 31 | res.goods_market_price = res.spec[0]['goods_market_price']; 32 | res.goods_num = res.spec[0]['goods_num']; 33 | res.all_goods_num = 0; 34 | res.spec.forEach(specRes=>{ 35 | res.all_goods_num += parseInt(specRes.goods_num); 36 | }); 37 | 38 | } 39 | }); 40 | 41 | return data; 42 | } -------------------------------------------------------------------------------- /litemall-admin/src/api/order.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | import Qs from 'qs' 3 | 4 | export function listOrder(query) { 5 | return request({ 6 | url: '/order/list', 7 | method: 'get', 8 | params: query, 9 | paramsSerializer: function(params) { 10 | return Qs.stringify(params, { arrayFormat: 'repeat' }) 11 | } 12 | }) 13 | } 14 | 15 | export function detailOrder(id) { 16 | return request({ 17 | url: '/order/detail', 18 | method: 'get', 19 | params: { id } 20 | }) 21 | } 22 | 23 | export function shipOrder(data) { 24 | return request({ 25 | url: '/order/ship', 26 | method: 'post', 27 | data 28 | }) 29 | } 30 | 31 | export function refundOrder(data) { 32 | return request({ 33 | url: '/order/refund', 34 | method: 'post', 35 | data 36 | }) 37 | } 38 | 39 | export function payOrder(data) { 40 | return request({ 41 | url: '/order/pay', 42 | method: 'post', 43 | data 44 | }) 45 | } 46 | 47 | export function deleteOrder(data) { 48 | return request({ 49 | url: '/order/delete', 50 | method: 'post', 51 | data 52 | }) 53 | } 54 | 55 | export function replyComment(data) { 56 | return request({ 57 | url: '/order/reply', 58 | method: 'post', 59 | data 60 | }) 61 | } 62 | 63 | export function listChannel(id) { 64 | return request({ 65 | url: '/order/channel', 66 | method: 'get' 67 | }) 68 | } 69 | -------------------------------------------------------------------------------- /litemall-admin/src/icons/svg/404.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /litemall/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/config/ShiroExceptionHandler.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.admin.config; 2 | 3 | import org.apache.commons.logging.Log; 4 | import org.apache.commons.logging.LogFactory; 5 | import org.apache.shiro.authc.AuthenticationException; 6 | import org.apache.shiro.authz.AuthorizationException; 7 | import org.linlinjava.litemall.core.util.ResponseUtil; 8 | import org.springframework.core.Ordered; 9 | import org.springframework.core.annotation.Order; 10 | import org.springframework.web.bind.annotation.ControllerAdvice; 11 | import org.springframework.web.bind.annotation.ExceptionHandler; 12 | import org.springframework.web.bind.annotation.ResponseBody; 13 | 14 | @ControllerAdvice 15 | @Order(value = Ordered.HIGHEST_PRECEDENCE) 16 | public class ShiroExceptionHandler { 17 | 18 | private final Log logger = LogFactory.getLog(ShiroExceptionHandler.class); 19 | 20 | @ExceptionHandler(AuthenticationException.class) 21 | @ResponseBody 22 | public Object unauthenticatedHandler(AuthenticationException e) { 23 | logger.warn(e.getMessage(), e); 24 | return ResponseUtil.unlogin(); 25 | } 26 | 27 | @ExceptionHandler(AuthorizationException.class) 28 | @ResponseBody 29 | public Object unauthorizedHandler(AuthorizationException e) { 30 | logger.warn(e.getMessage(), e); 31 | return ResponseUtil.unauthz(); 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /litemall-admin/src/icons/svg/zip.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /litemall/litemall-core/src/main/java/org/linlinjava/litemall/core/task/Task.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.core.task; 2 | 3 | import com.google.common.primitives.Ints; 4 | 5 | import java.time.LocalDateTime; 6 | import java.util.concurrent.Delayed; 7 | import java.util.concurrent.TimeUnit; 8 | 9 | public abstract class Task implements Delayed, Runnable{ 10 | private String id = ""; 11 | private long start = 0; 12 | 13 | public Task(String id, long delayInMilliseconds){ 14 | this.id = id; 15 | this.start = System.currentTimeMillis() + delayInMilliseconds; 16 | } 17 | 18 | public String getId() { 19 | return id; 20 | } 21 | 22 | @Override 23 | public long getDelay(TimeUnit unit) { 24 | long diff = this.start - System.currentTimeMillis(); 25 | return unit.convert(diff, TimeUnit.MILLISECONDS); 26 | } 27 | 28 | @Override 29 | public int compareTo(Delayed o) { 30 | return Ints.saturatedCast(this.start - ((Task) o).start); 31 | } 32 | 33 | @Override 34 | public boolean equals(Object o) { 35 | if (this == o) return true; 36 | if (o == null) return false; 37 | if (!(o instanceof Task)) { 38 | return false; 39 | } 40 | Task t = (Task)o; 41 | return this.id.equals(t.getId()); 42 | } 43 | 44 | @Override 45 | public int hashCode() { 46 | return this.id.hashCode(); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /litemall/litemall-db/src/test/java/org/linlinjava/litemall/db/MapperReturnTest.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.db; 2 | 3 | import org.junit.Assert; 4 | import org.junit.Test; 5 | import org.junit.runner.RunWith; 6 | import org.linlinjava.litemall.db.dao.LitemallSystemMapper; 7 | import org.linlinjava.litemall.db.domain.LitemallSystem; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.boot.test.context.SpringBootTest; 10 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 11 | import org.springframework.test.context.junit4.SpringRunner; 12 | import org.springframework.test.context.web.WebAppConfiguration; 13 | 14 | @WebAppConfiguration 15 | @RunWith(SpringRunner.class) 16 | @SpringBootTest 17 | public class MapperReturnTest { 18 | 19 | @Autowired 20 | private LitemallSystemMapper systemMapper; 21 | 22 | @Test 23 | public void test() { 24 | LitemallSystem system = new LitemallSystem(); 25 | system.setKeyName("test-system-key"); 26 | system.setKeyValue("test-system-value"); 27 | int updates = systemMapper.insertSelective(system); 28 | Assert.assertEquals(updates, 1); 29 | 30 | updates = systemMapper.deleteByPrimaryKey(system.getId()); 31 | Assert.assertEquals(updates, 1); 32 | 33 | updates = systemMapper.updateByPrimaryKey(system); 34 | Assert.assertEquals(updates, 0); 35 | } 36 | 37 | } 38 | 39 | -------------------------------------------------------------------------------- /pcvue/src/components/admin/BreadcrumbNav.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 39 | 40 | 47 | -------------------------------------------------------------------------------- /litemall-admin/src/views/mall/region.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | 60 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 欢迎使用 GxShop商城系统 2 | 3 | ------ 4 | 5 | GxShop是一套前后端分离,功能齐全操作简易的商城框架.目前已实现B2C完整电商功能,支付集成了微信扫码支付和支付宝PC端。 6 | [vue前端基于青梧商城改造](https://gitee.com/qingwuitcn/qwShopVue) 7 | 后台基于LiteMall。 8 | 9 | > * 2021.05.26 三级分类、分类查询包含子分类商品 10 | > * LiteMall + Vue 前后分离 11 | > * 多商户、秒杀、团购、在线聊天、三级分销、Wechat支付、Alipay支付 12 | > * 支持二次开发 13 | 14 | ![cmd-markdown-logo](http://123.206.215.59/pc/logo.png) 15 | 16 | ## 代码地址: 17 | 18 | [后端代码地址 Gitee](https://gitee.com/lijunnew/GxShop/tree/master/litemall) 19 | [Vue 前端代码地址 Gitee](https://gitee.com/lijunnew/GxShop/tree/master/pcvue) 20 | 21 | [后端代码地址 github](https://github.com/liijun/GxShop/tree/master/litemall) 22 | [Vue 前端代码地址 github](https://github.com/liijun/GxShop/tree/master/pcvue) 23 | 24 | ## 演示地址: 25 | [演示地址](http://123.206.215.59) 26 | 演示支付为真实能用,请切勿支付,没时间给退款!!! 27 | > * [后台地址](http://123.206.215.59/shop-admin): admin 123456 28 | > * [用户登录](http://123.206.215.59/user/login): user123 user123 29 | 30 | 31 | > 欢迎各位提交建议、BUG。联系方式 **QQ群:234357526** `添加请写上说明如:GxShop商城`。 32 | 33 | ------ 34 | 35 | ## 如何使用GxShop商城? 36 | 37 | 38 | 39 | 1. LiteMall 后台 40 | 由于LiteMall没有PC端支付,我们增加了这一部分的后台功能。 41 | [LiteMall说明文档](https://linlinjava.gitbook.io/litemall/) 42 | 43 | 2. Vue 44 | 45 | ```vue 46 | npm install (安装扩展) 47 | 48 | 前端记得要修改src\plugins\api.js 应该是第一行 后端api 根域名,应该是127.0.0.1:8080 (这个是你api服务器域名) 49 | 50 | npm run build 51 | ``` 52 | 53 | 54 | 55 | 56 | ## 常见问题 57 | 58 | 1. 刷新404 后台无法访问。 59 | https://router.vuejs.org/zh/guide/essentials/history-mode.html 可根据自己环境修改 60 | 61 | -------------------------------------------------------------------------------- /litemall/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/dto/GoodsAllinone.java: -------------------------------------------------------------------------------- 1 | package org.linlinjava.litemall.admin.dto; 2 | 3 | import org.linlinjava.litemall.db.domain.LitemallGoods; 4 | import org.linlinjava.litemall.db.domain.LitemallGoodsAttribute; 5 | import org.linlinjava.litemall.db.domain.LitemallGoodsProduct; 6 | import org.linlinjava.litemall.db.domain.LitemallGoodsSpecification; 7 | 8 | public class GoodsAllinone { 9 | LitemallGoods goods; 10 | LitemallGoodsSpecification[] specifications; 11 | LitemallGoodsAttribute[] attributes; 12 | LitemallGoodsProduct[] products; 13 | 14 | public LitemallGoods getGoods() { 15 | return goods; 16 | } 17 | 18 | public void setGoods(LitemallGoods goods) { 19 | this.goods = goods; 20 | } 21 | 22 | public LitemallGoodsProduct[] getProducts() { 23 | return products; 24 | } 25 | 26 | public void setProducts(LitemallGoodsProduct[] products) { 27 | this.products = products; 28 | } 29 | 30 | public LitemallGoodsSpecification[] getSpecifications() { 31 | return specifications; 32 | } 33 | 34 | public void setSpecifications(LitemallGoodsSpecification[] specifications) { 35 | this.specifications = specifications; 36 | } 37 | 38 | public LitemallGoodsAttribute[] getAttributes() { 39 | return attributes; 40 | } 41 | 42 | public void setAttributes(LitemallGoodsAttribute[] attributes) { 43 | this.attributes = attributes; 44 | } 45 | 46 | } 47 | -------------------------------------------------------------------------------- /litemall-admin/src/styles/element-ui.scss: -------------------------------------------------------------------------------- 1 | // cover some element-ui styles 2 | 3 | .el-breadcrumb__inner, 4 | .el-breadcrumb__inner a { 5 | font-weight: 400 !important; 6 | } 7 | 8 | .el-upload { 9 | input[type="file"] { 10 | display: none !important; 11 | } 12 | } 13 | 14 | .el-upload__input { 15 | display: none; 16 | } 17 | 18 | .cell { 19 | .el-tag { 20 | margin-right: 0px; 21 | } 22 | } 23 | 24 | .small-padding { 25 | .cell { 26 | padding-left: 5px; 27 | padding-right: 5px; 28 | } 29 | } 30 | 31 | .fixed-width { 32 | .el-button--mini { 33 | padding: 7px 10px; 34 | min-width: 60px; 35 | } 36 | } 37 | 38 | .status-col { 39 | .cell { 40 | padding: 0 10px; 41 | text-align: center; 42 | 43 | .el-tag { 44 | margin-right: 0px; 45 | } 46 | } 47 | } 48 | 49 | // to fixed https://github.com/ElemeFE/element/issues/2461 50 | .el-dialog { 51 | transform: none; 52 | left: 0; 53 | position: relative; 54 | margin: 0 auto; 55 | } 56 | 57 | // refine element ui upload 58 | .upload-container { 59 | .el-upload { 60 | width: 100%; 61 | 62 | .el-upload-dragger { 63 | width: 100%; 64 | height: 200px; 65 | } 66 | } 67 | } 68 | 69 | // dropdown 70 | .el-dropdown-menu { 71 | a { 72 | display: block 73 | } 74 | } 75 | 76 | // fix date-picker ui bug in filter-item 77 | .el-range-editor.el-input__inner { 78 | display: inline-flex !important; 79 | } 80 | 81 | // to fix el-date-picker css style 82 | .el-range-separator { 83 | box-sizing: content-box; 84 | } 85 | --------------------------------------------------------------------------------