├── .gitignore ├── README.md ├── admin-ui ├── .babelrc ├── .editorconfig ├── .eslintrc.js ├── .postcssrc.js ├── build │ ├── build.js │ ├── check-versions.js │ ├── logo.png │ ├── utils.js │ ├── vue-loader.conf.js │ ├── webpack.base.conf.js │ ├── webpack.dev.conf.js │ └── webpack.prod.conf.js ├── config │ ├── demo.env.js │ ├── dev.env.js │ ├── index.js │ └── prod.env.js ├── favicon.ico ├── index.html ├── package-lock.json ├── package.json ├── src │ ├── .umi │ │ ├── .cache │ │ │ └── babel-loader │ │ │ │ ├── 02e4bf11e25fe0f713f7c5b427e59863.json.gz │ │ │ │ ├── 09a8e0db3fdbf76304ad9f2278eac133.json.gz │ │ │ │ ├── 12348e2135b3ea302313fd0944a6cf3c.json.gz │ │ │ │ ├── 136c108a20a389dff340a4fd1fc46853.json.gz │ │ │ │ ├── 27fd0298291cda834506e6ccc9a32a88.json.gz │ │ │ │ ├── 35e8117ceceb1e168fa80e5bb6787a49.json.gz │ │ │ │ ├── 35eb3c121c5d15f751ea53c2a50eee8f.json.gz │ │ │ │ ├── 3885ed1e71102925a958f43185bca8f8.json.gz │ │ │ │ ├── 3d8ded884132d95b70ec91cb52029657.json.gz │ │ │ │ ├── 3df77ae68fc3d7f65b2e3c1175f1b25f.json.gz │ │ │ │ ├── 464cbd3326d998c97a89943d4dcbb6d7.json.gz │ │ │ │ ├── 5230467b7a6a325a598b5b86c136da0a.json.gz │ │ │ │ ├── 6356e389603bd0ce9c7f9a505fdf1ef4.json.gz │ │ │ │ ├── 63edd7d879e47bb5c207f473f8a79cd8.json.gz │ │ │ │ ├── 6662242c3df05193175fba1c8feb9c09.json.gz │ │ │ │ ├── 71b546e667e5f104c1102a873994acfd.json.gz │ │ │ │ ├── 73cacfef98ab799ab7b5ae35ec4dffc1.json.gz │ │ │ │ ├── 752393a5717ae70ce144f00265326bff.json.gz │ │ │ │ ├── 752f86e3ea2b7d3bcace5fdbba6a5d49.json.gz │ │ │ │ ├── 77f246fa4fe944808b245ef57bcb25cf.json.gz │ │ │ │ ├── 784cb26686addf2a372ce7741f410805.json.gz │ │ │ │ ├── 7e001ee36321c77c9a4c23a54a37b84d.json.gz │ │ │ │ ├── 80a14c71fc20fe02225b907b4a4b6a9f.json.gz │ │ │ │ ├── 90405bb085405f8b940c6772b7254597.json.gz │ │ │ │ ├── 9204908d46812329fa0ad27559ab5468.json.gz │ │ │ │ ├── a55f1b0a8384990f0218d5551963efa0.json.gz │ │ │ │ ├── adaa5d0bdf64c4ed00538ebf0f7ed3bf.json.gz │ │ │ │ ├── b0cd5d7fa9791f6fad190bd3e7d342cb.json.gz │ │ │ │ ├── b18ae66316975f30c0c8f69eaf5172b1.json.gz │ │ │ │ ├── b2c24e5d7257fea2a3359b087546abe9.json.gz │ │ │ │ ├── b70f1023cd6f7687b3596a0692a4d989.json.gz │ │ │ │ ├── b79c9979c2691bd291f47ba3464f46b3.json.gz │ │ │ │ ├── bc49e387347b257157da5fcd780328c7.json.gz │ │ │ │ ├── c91148f0c8ef090f898a73f5140ef3ab.json.gz │ │ │ │ ├── ca888dd09575c465b41178e4a6d968ee.json.gz │ │ │ │ ├── ce246a0191deb8b9d0cb8cd48a8e90af.json.gz │ │ │ │ ├── db8812e3ed8607ccbe55addd1c10a99a.json.gz │ │ │ │ ├── ddc871961624e54ed23c3129de1f6707.json.gz │ │ │ │ ├── df4a6d0e2cdcde1bf3c3aac337d7a333.json.gz │ │ │ │ ├── e0852911a3feb0733ebd8bc7ca2e7d4b.json.gz │ │ │ │ ├── e750dc5e5db3e6ed609f58d3370bd895.json.gz │ │ │ │ ├── f2ef171e3350a7b9d2e90bf8c4b385c4.json.gz │ │ │ │ └── f91948a99f6add6a54e2bd4b52657a2d.json.gz │ │ ├── core │ │ │ ├── devScripts.ts │ │ │ ├── history.ts │ │ │ ├── plugin.ts │ │ │ ├── pluginConfig.d.ts │ │ │ ├── pluginRegister.ts │ │ │ ├── polyfill.ts │ │ │ ├── routes.ts │ │ │ └── umiExports.ts │ │ └── umi.ts │ ├── App.vue │ ├── api │ │ ├── ad.js │ │ ├── admin.js │ │ ├── article.js │ │ ├── brand.js │ │ ├── category.js │ │ ├── comment.js │ │ ├── coupon.js │ │ ├── dashboard.js │ │ ├── goods.js │ │ ├── groupon.js │ │ ├── issue.js │ │ ├── keyword.js │ │ ├── login.js │ │ ├── order.js │ │ ├── profile.js │ │ ├── qiniu.js │ │ ├── region.js │ │ ├── role.js │ │ ├── stat.js │ │ ├── storage.js │ │ ├── topic.js │ │ └── user.js │ ├── assets │ │ ├── 401_images │ │ │ └── 401.gif │ │ ├── 404_images │ │ │ ├── 404.png │ │ │ └── 404_cloud.png │ │ └── custom-theme │ │ │ ├── fonts │ │ │ ├── element-icons.ttf │ │ │ └── element-icons.woff │ │ │ └── index.css │ ├── components │ │ ├── BackToTop │ │ │ └── index.vue │ │ ├── Breadcrumb │ │ │ └── index.vue │ │ ├── Hamburger │ │ │ └── index.vue │ │ ├── LangSelect │ │ │ └── index.vue │ │ ├── Pagination │ │ │ └── index.vue │ │ ├── Screenfull │ │ │ └── index.vue │ │ ├── ScrollPane │ │ │ └── index.vue │ │ ├── SizeSelect │ │ │ └── index.vue │ │ ├── SvgIcon │ │ │ └── index.vue │ │ └── ThemePicker │ │ │ └── index.vue │ ├── directive │ │ ├── clipboard │ │ │ ├── clipboard.js │ │ │ └── index.js │ │ └── permission │ │ │ ├── index.js │ │ │ └── permission.js │ ├── filters │ │ └── index.js │ ├── icons │ │ ├── index.js │ │ ├── svg │ │ │ ├── 404.svg │ │ │ ├── bug.svg │ │ │ ├── chart.svg │ │ │ ├── clipboard.svg │ │ │ ├── component.svg │ │ │ ├── dashboard.svg │ │ │ ├── documentation.svg │ │ │ ├── drag.svg │ │ │ ├── edit.svg │ │ │ ├── email.svg │ │ │ ├── example.svg │ │ │ ├── excel.svg │ │ │ ├── eye.svg │ │ │ ├── form.svg │ │ │ ├── guide 2.svg │ │ │ ├── guide.svg │ │ │ ├── icon.svg │ │ │ ├── international.svg │ │ │ ├── language.svg │ │ │ ├── link.svg │ │ │ ├── list.svg │ │ │ ├── lock.svg │ │ │ ├── message.svg │ │ │ ├── money.svg │ │ │ ├── nested.svg │ │ │ ├── password.svg │ │ │ ├── people.svg │ │ │ ├── peoples.svg │ │ │ ├── qq.svg │ │ │ ├── shopping.svg │ │ │ ├── size.svg │ │ │ ├── star.svg │ │ │ ├── tab.svg │ │ │ ├── table.svg │ │ │ ├── theme.svg │ │ │ ├── tree.svg │ │ │ ├── user.svg │ │ │ ├── wechat.svg │ │ │ └── zip.svg │ │ └── svgo.yml │ ├── lang │ │ ├── en.js │ │ ├── index.js │ │ └── zh.js │ ├── main.js │ ├── permission.js │ ├── router │ │ └── index.js │ ├── store │ │ ├── getters.js │ │ ├── index.js │ │ └── modules │ │ │ ├── app.js │ │ │ ├── permission.js │ │ │ ├── tagsView.js │ │ │ └── user.js │ ├── styles │ │ ├── btn.scss │ │ ├── element-ui.scss │ │ ├── index.scss │ │ ├── mixin.scss │ │ ├── sidebar.scss │ │ ├── transition.scss │ │ └── variables.scss │ ├── utils │ │ ├── auth.js │ │ ├── clipboard.js │ │ ├── createUniqueString.js │ │ ├── i18n.js │ │ ├── index.js │ │ ├── openWindow.js │ │ ├── permission.js │ │ ├── request.js │ │ ├── scrollTo.js │ │ └── validate.js │ ├── vendor │ │ ├── Export2Excel.js │ │ └── Export2Zip.js │ └── views │ │ ├── dashboard │ │ └── index.vue │ │ ├── errorPage │ │ ├── 401.vue │ │ └── 404.vue │ │ ├── goods │ │ ├── comment.vue │ │ ├── create.vue │ │ ├── edit.vue │ │ └── list.vue │ │ ├── layout │ │ ├── Layout.vue │ │ ├── components │ │ │ ├── AppMain.vue │ │ │ ├── Navbar.vue │ │ │ ├── Sidebar │ │ │ │ ├── FixiOSBug.js │ │ │ │ ├── Item.vue │ │ │ │ ├── Link.vue │ │ │ │ ├── SidebarItem.vue │ │ │ │ └── index.vue │ │ │ ├── TagsView.vue │ │ │ └── index.js │ │ └── mixin │ │ │ └── ResizeHandler.js │ │ ├── login │ │ ├── authredirect.vue │ │ └── index.vue │ │ ├── mall │ │ ├── brand.vue │ │ ├── category.vue │ │ ├── issue.vue │ │ ├── keyword.vue │ │ ├── order.vue │ │ └── region.vue │ │ ├── profile │ │ └── password.vue │ │ ├── promotion │ │ ├── ad.vue │ │ ├── articleCreate.vue │ │ ├── articleEdit.vue │ │ ├── articleList.vue │ │ ├── coupon.vue │ │ ├── couponDetail.vue │ │ ├── grouponActivity.vue │ │ ├── grouponRule.vue │ │ └── topic.vue │ │ ├── redirect │ │ └── index.vue │ │ ├── stat │ │ ├── goods.vue │ │ ├── order.vue │ │ └── user.vue │ │ ├── sys │ │ ├── admin.vue │ │ ├── os.vue │ │ └── role.vue │ │ └── user │ │ ├── address.vue │ │ ├── collect.vue │ │ ├── feedback.vue │ │ ├── footprint.vue │ │ ├── history.vue │ │ └── user.vue └── static │ └── tinymce4.7.5 │ ├── langs │ └── zh_CN.js │ ├── plugins │ ├── codesample │ │ └── css │ │ │ └── prism.css │ ├── emoticons │ │ └── img │ │ │ ├── smiley-cool.gif │ │ │ ├── smiley-cry.gif │ │ │ ├── smiley-embarassed.gif │ │ │ ├── smiley-foot-in-mouth.gif │ │ │ ├── smiley-frown.gif │ │ │ ├── smiley-innocent.gif │ │ │ ├── smiley-kiss.gif │ │ │ ├── smiley-laughing.gif │ │ │ ├── smiley-money-mouth.gif │ │ │ ├── smiley-sealed.gif │ │ │ ├── smiley-smile.gif │ │ │ ├── smiley-surprised.gif │ │ │ ├── smiley-tongue-out.gif │ │ │ ├── smiley-undecided.gif │ │ │ ├── smiley-wink.gif │ │ │ └── smiley-yell.gif │ └── visualblocks │ │ └── css │ │ └── visualblocks.css │ ├── skins │ └── lightgray │ │ ├── content.inline.min.css │ │ ├── content.min.css │ │ ├── fonts │ │ ├── tinymce-mobile.woff │ │ ├── tinymce-small.eot │ │ ├── tinymce-small.svg │ │ ├── tinymce-small.ttf │ │ ├── tinymce-small.woff │ │ ├── tinymce.eot │ │ ├── tinymce.svg │ │ ├── tinymce.ttf │ │ └── tinymce.woff │ │ ├── img │ │ ├── anchor.gif │ │ ├── loader.gif │ │ ├── object.gif │ │ └── trans.gif │ │ ├── skin.min.css │ │ └── skin.min.css.map │ └── tinymce.min.js ├── doc ├── dts-shop-表结构.sql ├── dts-shop-表结构和数据-20200326.sql └── dts-shop模型域.ndm ├── dts-admin-api ├── .gitignore ├── pom.xml └── src │ └── main │ ├── java │ └── com │ │ └── qiguliuxing │ │ └── dts │ │ └── admin │ │ ├── annotation │ │ └── RequiresPermissionsDesc.java │ │ ├── api │ │ └── Application.java │ │ ├── config │ │ ├── ShiroConfig.java │ │ └── ShiroExceptionHandler.java │ │ ├── dao │ │ ├── AccountVo.java │ │ ├── GoodsAllinone.java │ │ └── Product.java │ │ ├── job │ │ ├── CouponJob.java │ │ ├── OrderJob.java │ │ └── SettlementJob.java │ │ ├── service │ │ ├── AdminBrandService.java │ │ ├── AdminGoodsService.java │ │ └── AdminOrderService.java │ │ ├── shiro │ │ ├── AdminAuthorizingRealm.java │ │ └── AdminWebSessionManager.java │ │ ├── util │ │ ├── AdminResponseCode.java │ │ ├── AdminResponseUtil.java │ │ ├── ArticleType.java │ │ ├── CatVo.java │ │ ├── DtsBrandVo.java │ │ ├── PermVo.java │ │ ├── Permission.java │ │ ├── PermissionUtil.java │ │ └── StatVo.java │ │ └── web │ │ ├── AdminAdController.java │ │ ├── AdminAddressController.java │ │ ├── AdminAdminController.java │ │ ├── AdminArticleController.java │ │ ├── AdminAuthController.java │ │ ├── AdminBrandController.java │ │ ├── AdminBrokerageController.java │ │ ├── AdminCategoryController.java │ │ ├── AdminCollectController.java │ │ ├── AdminCommentController.java │ │ ├── AdminCouponController.java │ │ ├── AdminDashbordController.java │ │ ├── AdminFeedbackController.java │ │ ├── AdminFootprintController.java │ │ ├── AdminGoodsController.java │ │ ├── AdminGrouponController.java │ │ ├── AdminHistoryController.java │ │ ├── AdminIndexController.java │ │ ├── AdminIssueController.java │ │ ├── AdminKeywordController.java │ │ ├── AdminOrderController.java │ │ ├── AdminProfileController.java │ │ ├── AdminRegionController.java │ │ ├── AdminRoleController.java │ │ ├── AdminStatController.java │ │ ├── AdminStorageController.java │ │ ├── AdminTopicController.java │ │ └── AdminUserController.java │ └── resources │ ├── application.yml │ └── logback-spring.xml ├── dts-core ├── .gitignore ├── pom.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── qiguliuxing │ │ │ └── dts │ │ │ └── core │ │ │ ├── config │ │ │ ├── AsyncConfig.java │ │ │ ├── CorsConfig.java │ │ │ ├── GlobalExceptionHandler.java │ │ │ ├── JacksonConfig.java │ │ │ ├── ValidatorConfiguration.java │ │ │ ├── WxConfig.java │ │ │ └── WxProperties.java │ │ │ ├── consts │ │ │ └── CommConsts.java │ │ │ ├── express │ │ │ ├── ExpressService.java │ │ │ ├── config │ │ │ │ ├── ExpressAutoConfiguration.java │ │ │ │ └── ExpressProperties.java │ │ │ └── dao │ │ │ │ ├── ExpressInfo.java │ │ │ │ └── Traces.java │ │ │ ├── notify │ │ │ ├── EmailHelper.java │ │ │ ├── NotifyService.java │ │ │ ├── NotifyType.java │ │ │ ├── SmsResult.java │ │ │ ├── SmsSender.java │ │ │ ├── SslMailSender.java │ │ │ ├── TencentSmsSender.java │ │ │ ├── WxTemplateSender.java │ │ │ └── config │ │ │ │ ├── NotifyAutoConfiguration.java │ │ │ │ └── NotifyProperties.java │ │ │ ├── qcode │ │ │ └── QCodeService.java │ │ │ ├── storage │ │ │ ├── AliyunStorage.java │ │ │ ├── LocalStorage.java │ │ │ ├── QiniuStorage.java │ │ │ ├── Storage.java │ │ │ ├── StorageService.java │ │ │ ├── TencentStorage.java │ │ │ └── config │ │ │ │ ├── StorageAutoConfiguration.java │ │ │ │ └── StorageProperties.java │ │ │ ├── system │ │ │ ├── BaseConfig.java │ │ │ ├── ConfigService.java │ │ │ ├── SystemConfig.java │ │ │ └── SystemInistService.java │ │ │ ├── type │ │ │ ├── BrokerageTypeEnum.java │ │ │ └── UserTypeEnum.java │ │ │ ├── util │ │ │ ├── CharUtil.java │ │ │ ├── DateTimeUtil.java │ │ │ ├── HttpUtil.java │ │ │ ├── JacksonUtil.java │ │ │ ├── RegexUtil.java │ │ │ ├── ResponseUtil.java │ │ │ ├── SystemInfoPrinter.java │ │ │ └── bcrypt │ │ │ │ ├── BCrypt.java │ │ │ │ └── BCryptPasswordEncoder.java │ │ │ └── validator │ │ │ ├── Order.java │ │ │ ├── OrderValidator.java │ │ │ ├── Sort.java │ │ │ └── SortValidator.java │ └── resources │ │ ├── .gitignore │ │ ├── application-demo.yml │ │ ├── application-dev.yml │ │ ├── back.png │ │ └── back_groupon.png │ └── test │ ├── java │ └── com │ │ └── qiguliuxing │ │ └── dts │ │ └── core │ │ └── AliyunStorageTest.java │ └── resources │ └── 二维码.jpeg ├── dts-dao ├── .gitignore ├── mybatis-generator │ └── generatorConfig.xml ├── pom.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── qiguliuxing │ │ │ └── dts │ │ │ └── db │ │ │ ├── dao │ │ │ ├── DtsAccountTraceMapper.java │ │ │ ├── DtsAdMapper.java │ │ │ ├── DtsAddressMapper.java │ │ │ ├── DtsAdminMapper.java │ │ │ ├── DtsArticleMapper.java │ │ │ ├── DtsBrandMapper.java │ │ │ ├── DtsCartMapper.java │ │ │ ├── DtsCategoryMapper.java │ │ │ ├── DtsCollectMapper.java │ │ │ ├── DtsCommentMapper.java │ │ │ ├── DtsCouponMapper.java │ │ │ ├── DtsCouponUserMapper.java │ │ │ ├── DtsDelPictureMapper.java │ │ │ ├── DtsFeedbackMapper.java │ │ │ ├── DtsFootprintMapper.java │ │ │ ├── DtsGoodsAttributeMapper.java │ │ │ ├── DtsGoodsMapper.java │ │ │ ├── DtsGoodsProductMapper.java │ │ │ ├── DtsGoodsSpecificationMapper.java │ │ │ ├── DtsGrouponMapper.java │ │ │ ├── DtsGrouponRulesMapper.java │ │ │ ├── DtsIssueMapper.java │ │ │ ├── DtsKeywordMapper.java │ │ │ ├── DtsOrderGoodsMapper.java │ │ │ ├── DtsOrderMapper.java │ │ │ ├── DtsPermissionMapper.java │ │ │ ├── DtsRegionMapper.java │ │ │ ├── DtsRoleMapper.java │ │ │ ├── DtsSearchHistoryMapper.java │ │ │ ├── DtsStorageMapper.java │ │ │ ├── DtsSystemMapper.java │ │ │ ├── DtsTopicMapper.java │ │ │ ├── DtsUserAccountMapper.java │ │ │ ├── DtsUserFormidMapper.java │ │ │ ├── DtsUserMapper.java │ │ │ └── ex │ │ │ │ ├── AccountMapperEx.java │ │ │ │ ├── GoodsProductMapper.java │ │ │ │ ├── OrderMapper.java │ │ │ │ └── StatMapper.java │ │ │ ├── domain │ │ │ ├── DtsAccountTrace.java │ │ │ ├── DtsAccountTraceExample.java │ │ │ ├── DtsAd.java │ │ │ ├── DtsAdExample.java │ │ │ ├── DtsAddress.java │ │ │ ├── DtsAddressExample.java │ │ │ ├── DtsAdmin.java │ │ │ ├── DtsAdminExample.java │ │ │ ├── DtsArticle.java │ │ │ ├── DtsArticleExample.java │ │ │ ├── DtsBrand.java │ │ │ ├── DtsBrandExample.java │ │ │ ├── DtsCart.java │ │ │ ├── DtsCartExample.java │ │ │ ├── DtsCategory.java │ │ │ ├── DtsCategoryExample.java │ │ │ ├── DtsCollect.java │ │ │ ├── DtsCollectExample.java │ │ │ ├── DtsComment.java │ │ │ ├── DtsCommentExample.java │ │ │ ├── DtsCoupon.java │ │ │ ├── DtsCouponExample.java │ │ │ ├── DtsCouponUser.java │ │ │ ├── DtsCouponUserExample.java │ │ │ ├── DtsDelPicture.java │ │ │ ├── DtsDelPictureExample.java │ │ │ ├── DtsFeedback.java │ │ │ ├── DtsFeedbackExample.java │ │ │ ├── DtsFootprint.java │ │ │ ├── DtsFootprintExample.java │ │ │ ├── DtsGoods.java │ │ │ ├── DtsGoodsAttribute.java │ │ │ ├── DtsGoodsAttributeExample.java │ │ │ ├── DtsGoodsExample.java │ │ │ ├── DtsGoodsProduct.java │ │ │ ├── DtsGoodsProductExample.java │ │ │ ├── DtsGoodsSpecification.java │ │ │ ├── DtsGoodsSpecificationExample.java │ │ │ ├── DtsGroupon.java │ │ │ ├── DtsGrouponExample.java │ │ │ ├── DtsGrouponRules.java │ │ │ ├── DtsGrouponRulesExample.java │ │ │ ├── DtsIssue.java │ │ │ ├── DtsIssueExample.java │ │ │ ├── DtsKeyword.java │ │ │ ├── DtsKeywordExample.java │ │ │ ├── DtsOrder.java │ │ │ ├── DtsOrderExample.java │ │ │ ├── DtsOrderGoods.java │ │ │ ├── DtsOrderGoodsExample.java │ │ │ ├── DtsPermission.java │ │ │ ├── DtsPermissionExample.java │ │ │ ├── DtsRegion.java │ │ │ ├── DtsRegionExample.java │ │ │ ├── DtsRole.java │ │ │ ├── DtsRoleExample.java │ │ │ ├── DtsSearchHistory.java │ │ │ ├── DtsSearchHistoryExample.java │ │ │ ├── DtsStorage.java │ │ │ ├── DtsStorageExample.java │ │ │ ├── DtsSystem.java │ │ │ ├── DtsSystemExample.java │ │ │ ├── DtsTopic.java │ │ │ ├── DtsTopicExample.java │ │ │ ├── DtsUser.java │ │ │ ├── DtsUserAccount.java │ │ │ ├── DtsUserAccountExample.java │ │ │ ├── DtsUserExample.java │ │ │ ├── DtsUserFormid.java │ │ │ ├── DtsUserFormidExample.java │ │ │ └── UserVo.java │ │ │ ├── mybatis │ │ │ ├── JsonIntegerArrayTypeHandler.java │ │ │ ├── JsonNodeTypeHandler.java │ │ │ └── JsonStringArrayTypeHandler.java │ │ │ ├── service │ │ │ ├── CouponAssignService.java │ │ │ ├── CouponVerifyService.java │ │ │ ├── DtsAccountService.java │ │ │ ├── DtsAdService.java │ │ │ ├── DtsAddressService.java │ │ │ ├── DtsAdminService.java │ │ │ ├── DtsArticleService.java │ │ │ ├── DtsBrandService.java │ │ │ ├── DtsCartService.java │ │ │ ├── DtsCategoryService.java │ │ │ ├── DtsCollectService.java │ │ │ ├── DtsCommentService.java │ │ │ ├── DtsCouponService.java │ │ │ ├── DtsCouponUserService.java │ │ │ ├── DtsFeedbackService.java │ │ │ ├── DtsFootprintService.java │ │ │ ├── DtsGoodsAttributeService.java │ │ │ ├── DtsGoodsProductService.java │ │ │ ├── DtsGoodsService.java │ │ │ ├── DtsGoodsSpecificationService.java │ │ │ ├── DtsGrouponRulesService.java │ │ │ ├── DtsGrouponService.java │ │ │ ├── DtsIssueService.java │ │ │ ├── DtsKeywordService.java │ │ │ ├── DtsOrderGoodsService.java │ │ │ ├── DtsOrderService.java │ │ │ ├── DtsPermissionService.java │ │ │ ├── DtsRegionService.java │ │ │ ├── DtsRoleService.java │ │ │ ├── DtsSearchHistoryService.java │ │ │ ├── DtsStorageService.java │ │ │ ├── DtsSystemConfigService.java │ │ │ ├── DtsTopicService.java │ │ │ ├── DtsUserFormIdService.java │ │ │ ├── DtsUserService.java │ │ │ └── StatService.java │ │ │ └── util │ │ │ ├── CouponConstant.java │ │ │ ├── CouponUserConstant.java │ │ │ ├── OrderHandleOption.java │ │ │ └── OrderUtil.java │ └── resources │ │ └── com │ │ └── qiguliuxing │ │ └── dts │ │ └── db │ │ └── dao │ │ ├── DtsAccountTraceMapper.xml │ │ ├── DtsAdMapper.xml │ │ ├── DtsAddressMapper.xml │ │ ├── DtsAdminMapper.xml │ │ ├── DtsArticleMapper.xml │ │ ├── DtsBrandMapper.xml │ │ ├── DtsCartMapper.xml │ │ ├── DtsCategoryMapper.xml │ │ ├── DtsCollectMapper.xml │ │ ├── DtsCommentMapper.xml │ │ ├── DtsCouponMapper.xml │ │ ├── DtsCouponUserMapper.xml │ │ ├── DtsDelPictureMapper.xml │ │ ├── DtsFeedbackMapper.xml │ │ ├── DtsFootprintMapper.xml │ │ ├── DtsGoodsAttributeMapper.xml │ │ ├── DtsGoodsMapper.xml │ │ ├── DtsGoodsProductMapper.xml │ │ ├── DtsGoodsSpecificationMapper.xml │ │ ├── DtsGrouponMapper.xml │ │ ├── DtsGrouponRulesMapper.xml │ │ ├── DtsIssueMapper.xml │ │ ├── DtsKeywordMapper.xml │ │ ├── DtsOrderGoodsMapper.xml │ │ ├── DtsOrderMapper.xml │ │ ├── DtsPermissionMapper.xml │ │ ├── DtsRegionMapper.xml │ │ ├── DtsRoleMapper.xml │ │ ├── DtsSearchHistoryMapper.xml │ │ ├── DtsStorageMapper.xml │ │ ├── DtsSystemMapper.xml │ │ ├── DtsTopicMapper.xml │ │ ├── DtsUserAccountMapper.xml │ │ ├── DtsUserFormidMapper.xml │ │ ├── DtsUserMapper.xml │ │ └── ex │ │ ├── AccountMapperEx.xml │ │ ├── GoodsProductMapper.xml │ │ ├── OrderMapper.xml │ │ └── StatMapper.xml │ └── test │ └── java │ └── com │ └── qiguliuxing │ └── dts │ └── dao │ ├── AppTest.java │ ├── DbConfigTest.java │ ├── DbTest.java │ ├── MapperReturnTest.java │ ├── StatMapperTest.java │ └── StockTest.java ├── dts-wx-api ├── .gitignore ├── pom.xml └── src │ └── main │ ├── java │ └── com │ │ └── qiguliuxing │ │ └── dts │ │ └── wx │ │ ├── Application.java │ │ ├── annotation │ │ ├── LoginUser.java │ │ └── support │ │ │ └── LoginUserHandlerMethodArgumentResolver.java │ │ ├── config │ │ └── WxWebMvcConfiguration.java │ │ ├── dao │ │ ├── BrandCartGoods.java │ │ ├── BrandOrderGoods.java │ │ ├── CaptchaItem.java │ │ ├── CouponVo.java │ │ ├── UserInfo.java │ │ ├── UserToken.java │ │ └── WxLoginInfo.java │ │ ├── service │ │ ├── CaptchaCodeManager.java │ │ ├── GetRegionService.java │ │ ├── HomeCacheManager.java │ │ ├── UserInfoService.java │ │ ├── UserTokenManager.java │ │ └── WxOrderService.java │ │ ├── util │ │ ├── IpUtil.java │ │ ├── WxResponseCode.java │ │ └── WxResponseUtil.java │ │ └── web │ │ ├── WxAddressController.java │ │ ├── WxArticleController.java │ │ ├── WxAuthController.java │ │ ├── WxBrandController.java │ │ ├── WxBrokerageController.java │ │ ├── WxCartController.java │ │ ├── WxCatalogController.java │ │ ├── WxCollectController.java │ │ ├── WxCommentController.java │ │ ├── WxCouponController.java │ │ ├── WxFeedbackController.java │ │ ├── WxFootprintController.java │ │ ├── WxGoodsController.java │ │ ├── WxGrouponController.java │ │ ├── WxHomeController.java │ │ ├── WxIndexController.java │ │ ├── WxOrderController.java │ │ ├── WxRegionController.java │ │ ├── WxSearchController.java │ │ ├── WxStorageController.java │ │ ├── WxTopicController.java │ │ ├── WxUserController.java │ │ └── WxUserFormId.java │ └── resources │ ├── application.yml │ └── logback-spring.xml ├── pom.xml └── wx-mini-program ├── app.js ├── app.json ├── app.wxss ├── config └── api.js ├── lib ├── coupon-window │ ├── index.js │ ├── index.json │ ├── index.wxml │ └── index.wxss ├── home │ ├── index.js │ ├── index.json │ ├── index.wxml │ └── index.wxss ├── share-red-packets │ ├── index.js │ ├── index.json │ ├── index.wxml │ └── index.wxss ├── wxParse │ ├── html2json.js │ ├── htmlparser.js │ ├── showdown.js │ ├── wxDiscode.js │ ├── wxParse.js │ ├── wxParse.wxml │ └── wxParse.wxss └── zanui-weapp │ └── capsule │ ├── index.js │ ├── index.json │ ├── index.wxml │ └── index.wxss ├── pages ├── about │ ├── about.js │ ├── about.json │ ├── about.wxml │ └── about.wxss ├── article │ ├── article.js │ ├── article.json │ ├── article.wxml │ └── article.wxss ├── auth │ ├── accountLogin │ │ ├── accountLogin.js │ │ ├── accountLogin.json │ │ ├── accountLogin.wxml │ │ └── accountLogin.wxss │ ├── login │ │ ├── login.js │ │ ├── login.json │ │ ├── login.wxml │ │ └── login.wxss │ ├── register │ │ ├── register.js │ │ ├── register.json │ │ ├── register.wxml │ │ └── register.wxss │ └── reset │ │ ├── reset.js │ │ ├── reset.json │ │ ├── reset.wxml │ │ └── reset.wxss ├── brand │ ├── brand.js │ ├── brand.json │ ├── brand.wxml │ └── brand.wxss ├── brandDetail │ ├── brandDetail.js │ ├── brandDetail.json │ ├── brandDetail.wxml │ └── brandDetail.wxss ├── brokerage │ ├── main │ │ ├── main.js │ │ ├── main.json │ │ ├── main.wxml │ │ └── main.wxss │ ├── order │ │ ├── order.js │ │ ├── order.json │ │ ├── order.wxml │ │ └── order.wxss │ ├── record │ │ ├── record.js │ │ ├── record.json │ │ ├── record.wxml │ │ └── record.wxss │ └── withdrawal │ │ ├── withdrawal.js │ │ ├── withdrawal.json │ │ ├── withdrawal.wxml │ │ └── withdrawal.wxss ├── cart │ ├── cart.js │ ├── cart.json │ ├── cart.wxml │ └── cart.wxss ├── catalog │ ├── catalog.js │ ├── catalog.json │ ├── catalog.wxml │ └── catalog.wxss ├── category │ ├── category.js │ ├── category.json │ ├── category.wxml │ └── category.wxss ├── checkout │ ├── checkout.js │ ├── checkout.json │ ├── checkout.wxml │ └── checkout.wxss ├── comment │ ├── comment.js │ ├── comment.json │ ├── comment.wxml │ └── comment.wxss ├── commentPost │ ├── commentPost.js │ ├── commentPost.json │ ├── commentPost.wxml │ └── commentPost.wxss ├── coupon │ ├── coupon.js │ ├── coupon.json │ ├── coupon.wxml │ └── coupon.wxss ├── goods │ ├── goods.js │ ├── goods.json │ ├── goods.wxml │ └── goods.wxss ├── groupon │ ├── grouponDetail │ │ ├── grouponDetail.js │ │ ├── grouponDetail.json │ │ ├── grouponDetail.wxml │ │ └── grouponDetail.wxss │ ├── grouponList │ │ ├── grouponList.js │ │ ├── grouponList.json │ │ ├── grouponList.wxml │ │ └── grouponList.wxss │ └── myGroupon │ │ ├── myGroupon.js │ │ ├── myGroupon.json │ │ ├── myGroupon.wxml │ │ └── myGroupon.wxss ├── hotGoods │ ├── hotGoods.js │ ├── hotGoods.json │ ├── hotGoods.wxml │ └── hotGoods.wxss ├── index │ ├── index.js │ ├── index.json │ ├── index.wxml │ └── index.wxss ├── logs │ ├── logs.js │ ├── logs.json │ ├── logs.wxml │ └── logs.wxss ├── newGoods │ ├── newGoods.js │ ├── newGoods.json │ ├── newGoods.wxml │ └── newGoods.wxss ├── payResult │ ├── payResult.js │ ├── payResult.json │ ├── payResult.wxml │ └── payResult.wxss ├── search │ ├── search.js │ ├── search.json │ ├── search.wxml │ └── search.wxss ├── topic │ ├── topic.js │ ├── topic.json │ ├── topic.wxml │ └── topic.wxss ├── topicComment │ ├── topicComment.js │ ├── topicComment.json │ ├── topicComment.wxml │ └── topicComment.wxss ├── topicCommentPost │ ├── topicCommentPost.js │ ├── topicCommentPost.json │ ├── topicCommentPost.wxml │ └── topicCommentPost.wxss ├── topicDetail │ ├── topicDetail.js │ ├── topicDetail.json │ ├── topicDetail.wxml │ └── topicDetail.wxss └── ucenter │ ├── address │ ├── address.js │ ├── address.json │ ├── address.wxml │ └── address.wxss │ ├── addressAdd │ ├── addressAdd.js │ ├── addressAdd.json │ ├── addressAdd.wxml │ └── addressAdd.wxss │ ├── collect │ ├── collect.js │ ├── collect.json │ ├── collect.wxml │ └── collect.wxss │ ├── couponList │ ├── couponList.js │ ├── couponList.json │ ├── couponList.wxml │ └── couponList.wxss │ ├── couponSelect │ ├── couponSelect.js │ ├── couponSelect.json │ ├── couponSelect.wxml │ └── couponSelect.wxss │ ├── expressInfo │ ├── expressInfo.js │ ├── expressInfo.json │ ├── expressInfo.wxml │ └── expressInfo.wxss │ ├── feedback │ ├── feedback.js │ ├── feedback.json │ ├── feedback.wxml │ └── feedback.wxss │ ├── footprint │ ├── footprint.js │ ├── footprint.json │ ├── footprint.wxml │ └── footprint.wxss │ ├── index │ ├── index.js │ ├── index.json │ ├── index.wxml │ └── index.wxss │ ├── main │ ├── index.js │ ├── index.json │ ├── index.wxml │ └── index.wxss │ ├── order │ ├── order.js │ ├── order.json │ ├── order.wxml │ └── order.wxss │ ├── orderDetail │ ├── orderDetail.js │ ├── orderDetail.json │ ├── orderDetail.wxml │ └── orderDetail.wxss │ └── user │ ├── user.js │ ├── user.json │ ├── user.wxml │ └── user.wxss ├── project.config.json ├── sitemap.json ├── static ├── css │ ├── animate.wxss │ ├── guildford.wxss │ └── style.wxss ├── font │ └── iconfont.wxss └── images │ ├── about.png │ ├── about_us.png │ ├── address-bg-bd.png │ ├── address.png │ ├── address_right.png │ ├── avatar.png │ ├── cart.png │ ├── cart@selected.png │ ├── category.png │ ├── category@selected.png │ ├── channel_category.png │ ├── checkbox.png │ ├── clear_input.png │ ├── close.gif │ ├── comment.png │ ├── complete.png │ ├── coupon.png │ ├── customer.png │ ├── del-address.png │ ├── detail_back.png │ ├── dfh.png │ ├── dfk.png │ ├── down.png │ ├── dpj.png │ ├── dsh.png │ ├── edit-address.png │ ├── feedback.png │ ├── footprint.png │ ├── friend.png │ ├── go.png │ ├── group.png │ ├── home.png │ ├── home@selected.png │ ├── ic_menu_shoping_nor.png │ ├── ic_menu_topic_nor.png │ ├── ic_menu_topic_pressed.png │ ├── ico-addr.png │ ├── icon_close.png │ ├── icon_collect.png │ ├── icon_collect_checked.png │ ├── icon_error.png │ ├── icon_go_more.png │ ├── icon_like.png │ ├── icon_like_checked.png │ ├── kefu.png │ ├── mobile.png │ ├── my.png │ ├── my@selected.png │ ├── news.png │ ├── noAddress.png │ ├── noCart.png │ ├── noCart_old.png │ ├── open.gif │ ├── selnum.png │ ├── sh.png │ ├── share.png │ ├── telephone.png │ ├── title_search.png │ ├── wechat.png │ └── wxpay.png └── utils ├── check.js ├── user.js └── util.js /.gitignore: -------------------------------------------------------------------------------- 1 | /.idea/ 2 | /dts-admin-api/dts-admin-api.iml 3 | /dts-core/dts-core.iml 4 | /dts-dao/dts-dao.iml 5 | /dts-wx-api/dts-wx-api.iml 6 | /logs/ 7 | /admin-ui/node_modules/ 8 | -------------------------------------------------------------------------------- /admin-ui/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | ["env", { 4 | "modules": false, 5 | "targets": { 6 | "browsers": ["> 1%", "last 2 versions", "not ie <= 8"] 7 | } 8 | }], 9 | "stage-2" 10 | ], 11 | "plugins": ["transform-vue-jsx", "transform-runtime"], 12 | "env": { 13 | "development":{ 14 | "plugins": ["dynamic-import-node"] 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /admin-ui/.editorconfig: -------------------------------------------------------------------------------- 1 | # http://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 | -------------------------------------------------------------------------------- /admin-ui/.postcssrc.js: -------------------------------------------------------------------------------- 1 | // https://github.com/michael-ciniawsky/postcss-load-config 2 | 3 | module.exports = { 4 | "plugins": { 5 | "postcss-import": {}, 6 | "postcss-url": {}, 7 | // to edit target browsers: use "browserslist" field in package.json 8 | "autoprefixer": {} 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /admin-ui/build/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/build/logo.png -------------------------------------------------------------------------------- /admin-ui/build/vue-loader.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | module.exports = { 4 | //You can set the vue-loader configuration by yourself. 5 | } 6 | -------------------------------------------------------------------------------- /admin-ui/config/demo.env.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | NODE_ENV: '"production"', 3 | ENV_CONFIG: '"dep"', 4 | BASE_API: '"http://localhost:8083/admin"' 5 | } 6 | -------------------------------------------------------------------------------- /admin-ui/config/dev.env.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | NODE_ENV: '"development"', 3 | ENV_CONFIG: '"dev"', 4 | BASE_API: '"http://localhost:8083/demo/admin"' 5 | } 6 | -------------------------------------------------------------------------------- /admin-ui/config/prod.env.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | NODE_ENV: '"production"', 3 | ENV_CONFIG: '"prod"', 4 | BASE_API: '"https://www.xxx.com/manager"' 5 | } 6 | -------------------------------------------------------------------------------- /admin-ui/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/favicon.ico -------------------------------------------------------------------------------- /admin-ui/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 聚惠星管理后台 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /admin-ui/src/.umi/.cache/babel-loader/02e4bf11e25fe0f713f7c5b427e59863.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/src/.umi/.cache/babel-loader/02e4bf11e25fe0f713f7c5b427e59863.json.gz -------------------------------------------------------------------------------- /admin-ui/src/.umi/.cache/babel-loader/09a8e0db3fdbf76304ad9f2278eac133.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/src/.umi/.cache/babel-loader/09a8e0db3fdbf76304ad9f2278eac133.json.gz -------------------------------------------------------------------------------- /admin-ui/src/.umi/.cache/babel-loader/12348e2135b3ea302313fd0944a6cf3c.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/src/.umi/.cache/babel-loader/12348e2135b3ea302313fd0944a6cf3c.json.gz -------------------------------------------------------------------------------- /admin-ui/src/.umi/.cache/babel-loader/136c108a20a389dff340a4fd1fc46853.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/src/.umi/.cache/babel-loader/136c108a20a389dff340a4fd1fc46853.json.gz -------------------------------------------------------------------------------- /admin-ui/src/.umi/.cache/babel-loader/27fd0298291cda834506e6ccc9a32a88.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/src/.umi/.cache/babel-loader/27fd0298291cda834506e6ccc9a32a88.json.gz -------------------------------------------------------------------------------- /admin-ui/src/.umi/.cache/babel-loader/35e8117ceceb1e168fa80e5bb6787a49.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/src/.umi/.cache/babel-loader/35e8117ceceb1e168fa80e5bb6787a49.json.gz -------------------------------------------------------------------------------- /admin-ui/src/.umi/.cache/babel-loader/35eb3c121c5d15f751ea53c2a50eee8f.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/src/.umi/.cache/babel-loader/35eb3c121c5d15f751ea53c2a50eee8f.json.gz -------------------------------------------------------------------------------- /admin-ui/src/.umi/.cache/babel-loader/3885ed1e71102925a958f43185bca8f8.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/src/.umi/.cache/babel-loader/3885ed1e71102925a958f43185bca8f8.json.gz -------------------------------------------------------------------------------- /admin-ui/src/.umi/.cache/babel-loader/3d8ded884132d95b70ec91cb52029657.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/src/.umi/.cache/babel-loader/3d8ded884132d95b70ec91cb52029657.json.gz -------------------------------------------------------------------------------- /admin-ui/src/.umi/.cache/babel-loader/3df77ae68fc3d7f65b2e3c1175f1b25f.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/src/.umi/.cache/babel-loader/3df77ae68fc3d7f65b2e3c1175f1b25f.json.gz -------------------------------------------------------------------------------- /admin-ui/src/.umi/.cache/babel-loader/464cbd3326d998c97a89943d4dcbb6d7.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/src/.umi/.cache/babel-loader/464cbd3326d998c97a89943d4dcbb6d7.json.gz -------------------------------------------------------------------------------- /admin-ui/src/.umi/.cache/babel-loader/5230467b7a6a325a598b5b86c136da0a.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/src/.umi/.cache/babel-loader/5230467b7a6a325a598b5b86c136da0a.json.gz -------------------------------------------------------------------------------- /admin-ui/src/.umi/.cache/babel-loader/6356e389603bd0ce9c7f9a505fdf1ef4.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/src/.umi/.cache/babel-loader/6356e389603bd0ce9c7f9a505fdf1ef4.json.gz -------------------------------------------------------------------------------- /admin-ui/src/.umi/.cache/babel-loader/63edd7d879e47bb5c207f473f8a79cd8.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/src/.umi/.cache/babel-loader/63edd7d879e47bb5c207f473f8a79cd8.json.gz -------------------------------------------------------------------------------- /admin-ui/src/.umi/.cache/babel-loader/6662242c3df05193175fba1c8feb9c09.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/src/.umi/.cache/babel-loader/6662242c3df05193175fba1c8feb9c09.json.gz -------------------------------------------------------------------------------- /admin-ui/src/.umi/.cache/babel-loader/71b546e667e5f104c1102a873994acfd.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/src/.umi/.cache/babel-loader/71b546e667e5f104c1102a873994acfd.json.gz -------------------------------------------------------------------------------- /admin-ui/src/.umi/.cache/babel-loader/73cacfef98ab799ab7b5ae35ec4dffc1.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/src/.umi/.cache/babel-loader/73cacfef98ab799ab7b5ae35ec4dffc1.json.gz -------------------------------------------------------------------------------- /admin-ui/src/.umi/.cache/babel-loader/752393a5717ae70ce144f00265326bff.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/src/.umi/.cache/babel-loader/752393a5717ae70ce144f00265326bff.json.gz -------------------------------------------------------------------------------- /admin-ui/src/.umi/.cache/babel-loader/752f86e3ea2b7d3bcace5fdbba6a5d49.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/src/.umi/.cache/babel-loader/752f86e3ea2b7d3bcace5fdbba6a5d49.json.gz -------------------------------------------------------------------------------- /admin-ui/src/.umi/.cache/babel-loader/77f246fa4fe944808b245ef57bcb25cf.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/src/.umi/.cache/babel-loader/77f246fa4fe944808b245ef57bcb25cf.json.gz -------------------------------------------------------------------------------- /admin-ui/src/.umi/.cache/babel-loader/784cb26686addf2a372ce7741f410805.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/src/.umi/.cache/babel-loader/784cb26686addf2a372ce7741f410805.json.gz -------------------------------------------------------------------------------- /admin-ui/src/.umi/.cache/babel-loader/7e001ee36321c77c9a4c23a54a37b84d.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/src/.umi/.cache/babel-loader/7e001ee36321c77c9a4c23a54a37b84d.json.gz -------------------------------------------------------------------------------- /admin-ui/src/.umi/.cache/babel-loader/80a14c71fc20fe02225b907b4a4b6a9f.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/src/.umi/.cache/babel-loader/80a14c71fc20fe02225b907b4a4b6a9f.json.gz -------------------------------------------------------------------------------- /admin-ui/src/.umi/.cache/babel-loader/90405bb085405f8b940c6772b7254597.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/src/.umi/.cache/babel-loader/90405bb085405f8b940c6772b7254597.json.gz -------------------------------------------------------------------------------- /admin-ui/src/.umi/.cache/babel-loader/9204908d46812329fa0ad27559ab5468.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/src/.umi/.cache/babel-loader/9204908d46812329fa0ad27559ab5468.json.gz -------------------------------------------------------------------------------- /admin-ui/src/.umi/.cache/babel-loader/a55f1b0a8384990f0218d5551963efa0.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/src/.umi/.cache/babel-loader/a55f1b0a8384990f0218d5551963efa0.json.gz -------------------------------------------------------------------------------- /admin-ui/src/.umi/.cache/babel-loader/adaa5d0bdf64c4ed00538ebf0f7ed3bf.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/src/.umi/.cache/babel-loader/adaa5d0bdf64c4ed00538ebf0f7ed3bf.json.gz -------------------------------------------------------------------------------- /admin-ui/src/.umi/.cache/babel-loader/b0cd5d7fa9791f6fad190bd3e7d342cb.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/src/.umi/.cache/babel-loader/b0cd5d7fa9791f6fad190bd3e7d342cb.json.gz -------------------------------------------------------------------------------- /admin-ui/src/.umi/.cache/babel-loader/b18ae66316975f30c0c8f69eaf5172b1.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/src/.umi/.cache/babel-loader/b18ae66316975f30c0c8f69eaf5172b1.json.gz -------------------------------------------------------------------------------- /admin-ui/src/.umi/.cache/babel-loader/b2c24e5d7257fea2a3359b087546abe9.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/src/.umi/.cache/babel-loader/b2c24e5d7257fea2a3359b087546abe9.json.gz -------------------------------------------------------------------------------- /admin-ui/src/.umi/.cache/babel-loader/b70f1023cd6f7687b3596a0692a4d989.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/src/.umi/.cache/babel-loader/b70f1023cd6f7687b3596a0692a4d989.json.gz -------------------------------------------------------------------------------- /admin-ui/src/.umi/.cache/babel-loader/b79c9979c2691bd291f47ba3464f46b3.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/src/.umi/.cache/babel-loader/b79c9979c2691bd291f47ba3464f46b3.json.gz -------------------------------------------------------------------------------- /admin-ui/src/.umi/.cache/babel-loader/bc49e387347b257157da5fcd780328c7.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/src/.umi/.cache/babel-loader/bc49e387347b257157da5fcd780328c7.json.gz -------------------------------------------------------------------------------- /admin-ui/src/.umi/.cache/babel-loader/c91148f0c8ef090f898a73f5140ef3ab.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/src/.umi/.cache/babel-loader/c91148f0c8ef090f898a73f5140ef3ab.json.gz -------------------------------------------------------------------------------- /admin-ui/src/.umi/.cache/babel-loader/ca888dd09575c465b41178e4a6d968ee.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/src/.umi/.cache/babel-loader/ca888dd09575c465b41178e4a6d968ee.json.gz -------------------------------------------------------------------------------- /admin-ui/src/.umi/.cache/babel-loader/ce246a0191deb8b9d0cb8cd48a8e90af.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/src/.umi/.cache/babel-loader/ce246a0191deb8b9d0cb8cd48a8e90af.json.gz -------------------------------------------------------------------------------- /admin-ui/src/.umi/.cache/babel-loader/db8812e3ed8607ccbe55addd1c10a99a.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/src/.umi/.cache/babel-loader/db8812e3ed8607ccbe55addd1c10a99a.json.gz -------------------------------------------------------------------------------- /admin-ui/src/.umi/.cache/babel-loader/ddc871961624e54ed23c3129de1f6707.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/src/.umi/.cache/babel-loader/ddc871961624e54ed23c3129de1f6707.json.gz -------------------------------------------------------------------------------- /admin-ui/src/.umi/.cache/babel-loader/df4a6d0e2cdcde1bf3c3aac337d7a333.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/src/.umi/.cache/babel-loader/df4a6d0e2cdcde1bf3c3aac337d7a333.json.gz -------------------------------------------------------------------------------- /admin-ui/src/.umi/.cache/babel-loader/e0852911a3feb0733ebd8bc7ca2e7d4b.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/src/.umi/.cache/babel-loader/e0852911a3feb0733ebd8bc7ca2e7d4b.json.gz -------------------------------------------------------------------------------- /admin-ui/src/.umi/.cache/babel-loader/e750dc5e5db3e6ed609f58d3370bd895.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/src/.umi/.cache/babel-loader/e750dc5e5db3e6ed609f58d3370bd895.json.gz -------------------------------------------------------------------------------- /admin-ui/src/.umi/.cache/babel-loader/f2ef171e3350a7b9d2e90bf8c4b385c4.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/src/.umi/.cache/babel-loader/f2ef171e3350a7b9d2e90bf8c4b385c4.json.gz -------------------------------------------------------------------------------- /admin-ui/src/.umi/.cache/babel-loader/f91948a99f6add6a54e2bd4b52657a2d.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/src/.umi/.cache/babel-loader/f91948a99f6add6a54e2bd4b52657a2d.json.gz -------------------------------------------------------------------------------- /admin-ui/src/.umi/core/history.ts: -------------------------------------------------------------------------------- 1 | // @ts-nocheck 2 | import { createBrowserHistory, History } from 'D:/zhou/projects/demo/dts-shop/admin-ui/node_modules/@umijs/runtime'; 3 | 4 | let options = { 5 | "basename": "/" 6 | }; 7 | if ((window).routerBase) { 8 | options.basename = (window).routerBase; 9 | } 10 | 11 | // remove initial history because of ssr 12 | let history: History = process.env.__IS_SERVER ? null : createBrowserHistory(options); 13 | export const createHistory = (hotReload = false) => { 14 | if (!hotReload) { 15 | history = createBrowserHistory(options); 16 | } 17 | 18 | return history; 19 | }; 20 | 21 | export { history }; 22 | -------------------------------------------------------------------------------- /admin-ui/src/.umi/core/plugin.ts: -------------------------------------------------------------------------------- 1 | // @ts-nocheck 2 | import { Plugin } from 'D:/zhou/projects/demo/dts-shop/admin-ui/node_modules/@umijs/runtime'; 3 | 4 | const plugin = new Plugin({ 5 | validKeys: ['modifyClientRenderOpts','patchRoutes','rootContainer','render','onRouteChange',], 6 | }); 7 | 8 | export { plugin }; 9 | -------------------------------------------------------------------------------- /admin-ui/src/.umi/core/pluginRegister.ts: -------------------------------------------------------------------------------- 1 | // @ts-nocheck 2 | import { plugin } from './plugin'; 3 | 4 | -------------------------------------------------------------------------------- /admin-ui/src/.umi/core/polyfill.ts: -------------------------------------------------------------------------------- 1 | // @ts-nocheck 2 | import 'core-js'; 3 | import 'regenerator-runtime/runtime'; 4 | -------------------------------------------------------------------------------- /admin-ui/src/.umi/core/routes.ts: -------------------------------------------------------------------------------- 1 | // @ts-nocheck 2 | import React from 'react'; 3 | import { ApplyPluginsType } from 'D:/zhou/projects/demo/dts-shop/admin-ui/node_modules/@umijs/runtime'; 4 | import * as umiExports from './umiExports'; 5 | import { plugin } from './plugin'; 6 | 7 | export function getRoutes() { 8 | const routes = []; 9 | 10 | // allow user to extend routes 11 | plugin.applyPlugins({ 12 | key: 'patchRoutes', 13 | type: ApplyPluginsType.event, 14 | args: { routes }, 15 | }); 16 | 17 | return routes; 18 | } 19 | -------------------------------------------------------------------------------- /admin-ui/src/.umi/core/umiExports.ts: -------------------------------------------------------------------------------- 1 | // @ts-nocheck 2 | export { history } from './history'; 3 | export { plugin } from './plugin'; 4 | -------------------------------------------------------------------------------- /admin-ui/src/App.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | -------------------------------------------------------------------------------- /admin-ui/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 | -------------------------------------------------------------------------------- /admin-ui/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 | -------------------------------------------------------------------------------- /admin-ui/src/api/article.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export function listArticle(query) { 4 | return request({ 5 | url: '/article/list', 6 | method: 'get', 7 | params: query 8 | }) 9 | } 10 | 11 | export function deleteArticle(data) { 12 | return request({ 13 | url: '/article/delete', 14 | method: 'post', 15 | data 16 | }) 17 | } 18 | 19 | export function publishArticle(data) { 20 | return request({ 21 | url: '/article/create', 22 | method: 'post', 23 | data 24 | }) 25 | } 26 | 27 | export function detailArticle(id) { 28 | return request({ 29 | url: '/article/detail', 30 | method: 'get', 31 | params: { id } 32 | }) 33 | } 34 | 35 | export function editArticle(data) { 36 | return request({ 37 | url: '/article/update', 38 | method: 'post', 39 | data 40 | }) 41 | } 42 | 43 | -------------------------------------------------------------------------------- /admin-ui/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 | 43 | export function listCatAndAdmin() { 44 | return request({ 45 | url: '/brand/catAndAdmin', 46 | method: 'get' 47 | }) 48 | } 49 | -------------------------------------------------------------------------------- /admin-ui/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 | -------------------------------------------------------------------------------- /admin-ui/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 | -------------------------------------------------------------------------------- /admin-ui/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 | -------------------------------------------------------------------------------- /admin-ui/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 | -------------------------------------------------------------------------------- /admin-ui/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 | -------------------------------------------------------------------------------- /admin-ui/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 | -------------------------------------------------------------------------------- /admin-ui/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 | -------------------------------------------------------------------------------- /admin-ui/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 | -------------------------------------------------------------------------------- /admin-ui/src/api/login.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export function loginByUsername(username, password) { 4 | const data = { 5 | username, 6 | password 7 | } 8 | return request({ 9 | url: '/auth/login', 10 | method: 'post', 11 | data 12 | }) 13 | } 14 | 15 | export function logout() { 16 | return request({ 17 | url: '/auth/logout', 18 | method: 'post' 19 | }) 20 | } 21 | 22 | export function getUserInfo(token) { 23 | return request({ 24 | url: '/auth/info', 25 | method: 'get', 26 | params: { token } 27 | }) 28 | } 29 | 30 | -------------------------------------------------------------------------------- /admin-ui/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 replyComment(data) { 40 | return request({ 41 | url: '/order/reply', 42 | method: 'post', 43 | data 44 | }) 45 | } 46 | 47 | export function listShipChannel() { 48 | return request({ 49 | url: '/order/listShipChannel', 50 | method: 'get' 51 | }) 52 | } 53 | -------------------------------------------------------------------------------- /admin-ui/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 | -------------------------------------------------------------------------------- /admin-ui/src/api/qiniu.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export function getToken() { 4 | return request({ 5 | url: '/qiniu/upload/token', // 假地址 自行替换 6 | method: 'get' 7 | }) 8 | } 9 | -------------------------------------------------------------------------------- /admin-ui/src/api/region.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export function listRegion(query) { 4 | return request({ 5 | url: '/region/list', 6 | method: 'get', 7 | params: query 8 | }) 9 | } 10 | 11 | export function listSubRegion(query) { 12 | return request({ 13 | url: '/region/clist', 14 | method: 'get', 15 | params: query 16 | }) 17 | } 18 | -------------------------------------------------------------------------------- /admin-ui/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 | -------------------------------------------------------------------------------- /admin-ui/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.BASE_API + '/storage/create' 44 | export { uploadPath } 45 | -------------------------------------------------------------------------------- /admin-ui/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(data) { 20 | return request({ 21 | url: '/topic/read', 22 | method: 'get', 23 | data 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 | -------------------------------------------------------------------------------- /admin-ui/src/assets/401_images/401.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/src/assets/401_images/401.gif -------------------------------------------------------------------------------- /admin-ui/src/assets/404_images/404.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/src/assets/404_images/404.png -------------------------------------------------------------------------------- /admin-ui/src/assets/404_images/404_cloud.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/src/assets/404_images/404_cloud.png -------------------------------------------------------------------------------- /admin-ui/src/assets/custom-theme/fonts/element-icons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/src/assets/custom-theme/fonts/element-icons.ttf -------------------------------------------------------------------------------- /admin-ui/src/assets/custom-theme/fonts/element-icons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/src/assets/custom-theme/fonts/element-icons.woff -------------------------------------------------------------------------------- /admin-ui/src/components/LangSelect/index.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 32 | 33 | 40 | 41 | -------------------------------------------------------------------------------- /admin-ui/src/components/SvgIcon/index.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 34 | 35 | 44 | -------------------------------------------------------------------------------- /admin-ui/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 | -------------------------------------------------------------------------------- /admin-ui/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 | -------------------------------------------------------------------------------- /admin-ui/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 | -------------------------------------------------------------------------------- /admin-ui/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 | -------------------------------------------------------------------------------- /admin-ui/src/icons/svg/chart.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /admin-ui/src/icons/svg/clipboard.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /admin-ui/src/icons/svg/component.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /admin-ui/src/icons/svg/documentation.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /admin-ui/src/icons/svg/drag.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /admin-ui/src/icons/svg/edit.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /admin-ui/src/icons/svg/email.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /admin-ui/src/icons/svg/example.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /admin-ui/src/icons/svg/excel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /admin-ui/src/icons/svg/eye.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /admin-ui/src/icons/svg/guide 2.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /admin-ui/src/icons/svg/guide.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /admin-ui/src/icons/svg/icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /admin-ui/src/icons/svg/international.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /admin-ui/src/icons/svg/language.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /admin-ui/src/icons/svg/link.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /admin-ui/src/icons/svg/list.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /admin-ui/src/icons/svg/lock.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /admin-ui/src/icons/svg/message.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /admin-ui/src/icons/svg/money.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /admin-ui/src/icons/svg/nested.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /admin-ui/src/icons/svg/password.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /admin-ui/src/icons/svg/people.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /admin-ui/src/icons/svg/peoples.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /admin-ui/src/icons/svg/size.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /admin-ui/src/icons/svg/star.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /admin-ui/src/icons/svg/tab.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /admin-ui/src/icons/svg/table.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /admin-ui/src/icons/svg/theme.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /admin-ui/src/icons/svg/user.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /admin-ui/src/icons/svg/wechat.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /admin-ui/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 | -------------------------------------------------------------------------------- /admin-ui/src/lang/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import VueI18n from 'vue-i18n' 3 | import Cookies from 'js-cookie' 4 | import elementEnLocale from 'element-ui/lib/locale/lang/en' // element-ui lang 5 | import elementZhLocale from 'element-ui/lib/locale/lang/zh-CN'// element-ui lang 6 | import enLocale from './en' 7 | import zhLocale from './zh' 8 | 9 | Vue.use(VueI18n) 10 | 11 | const messages = { 12 | en: { 13 | ...enLocale, 14 | ...elementEnLocale 15 | }, 16 | zh: { 17 | ...zhLocale, 18 | ...elementZhLocale 19 | } 20 | } 21 | 22 | const i18n = new VueI18n({ 23 | // set locale 24 | // options: en | zh 25 | locale: Cookies.get('language') || 'zh', 26 | // set locale messages 27 | messages 28 | }) 29 | 30 | export default i18n 31 | -------------------------------------------------------------------------------- /admin-ui/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 'element-ui/lib/theme-chalk/index.css' 9 | 10 | import '@/styles/index.scss' // global css 11 | 12 | import App from './App' 13 | import router from './router' 14 | import store from './store' 15 | 16 | import i18n from './lang' // Internationalization 17 | import './icons' // icon 18 | import './permission' // permission control 19 | 20 | import * as filters from './filters' // global filters 21 | 22 | import permission from '@/directive/permission/index.js' // 权限判断指令 23 | 24 | Vue.use(Element, { 25 | size: Cookies.get('size') || 'medium', // set element-ui default size 26 | i18n: (key, value) => i18n.t(key, value) 27 | }) 28 | 29 | Vue.directive('permission', permission) 30 | 31 | // register global utility filters. 32 | Object.keys(filters).forEach(key => { 33 | Vue.filter(key, filters[key]) 34 | }) 35 | 36 | Vue.config.productionTip = false 37 | 38 | new Vue({ 39 | el: '#app', 40 | router, 41 | store, 42 | i18n, 43 | render: h => h(App) 44 | }) 45 | -------------------------------------------------------------------------------- /admin-ui/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 | introduction: state => state.user.introduction, 12 | status: state => state.user.status, 13 | roles: state => state.user.roles, 14 | perms: state => state.user.perms, 15 | setting: state => state.user.setting, 16 | permission_routers: state => state.permission.routers, 17 | addRouters: state => state.permission.addRouters 18 | } 19 | export default getters 20 | -------------------------------------------------------------------------------- /admin-ui/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 | -------------------------------------------------------------------------------- /admin-ui/src/styles/transition.scss: -------------------------------------------------------------------------------- 1 | //globl 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 | .fade-transform-enter { 20 | opacity: 0; 21 | transform: translateX(-30px); 22 | } 23 | .fade-transform-leave-to { 24 | opacity: 0; 25 | transform: translateX(30px); 26 | } 27 | 28 | /*breadcrumb transition*/ 29 | .breadcrumb-enter-active, 30 | .breadcrumb-leave-active { 31 | transition: all .5s; 32 | } 33 | 34 | .breadcrumb-enter, 35 | .breadcrumb-leave-active { 36 | opacity: 0; 37 | transform: translateX(20px); 38 | } 39 | 40 | .breadcrumb-move { 41 | transition: all .5s; 42 | } 43 | 44 | .breadcrumb-leave-active { 45 | position: absolute; 46 | } 47 | 48 | -------------------------------------------------------------------------------- /admin-ui/src/styles/variables.scss: -------------------------------------------------------------------------------- 1 | $blue:#324157; 2 | $light-blue:#3A71A8; 3 | $red:#C03639; 4 | $pink: #E65D6E; 5 | $green: #30B08F; 6 | $tiffany: #4AB7BD; 7 | $yellow:#FEC171; 8 | $panGreen: #30B08F; 9 | 10 | //sidebar 11 | $menuBg:#304156; 12 | $subMenuBg:#1f2d3d; 13 | $menuHover:#001528; 14 | -------------------------------------------------------------------------------- /admin-ui/src/utils/auth.js: -------------------------------------------------------------------------------- 1 | import Cookies from 'js-cookie' 2 | 3 | const TokenKey = 'X-Dts-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 | -------------------------------------------------------------------------------- /admin-ui/src/utils/clipboard.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Clipboard from 'clipboard' 3 | 4 | function clipboardSuccess() { 5 | Vue.prototype.$message({ 6 | message: 'Copy successfully', 7 | type: 'success', 8 | duration: 1500 9 | }) 10 | } 11 | 12 | function clipboardError() { 13 | Vue.prototype.$message({ 14 | message: 'Copy failed', 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 | -------------------------------------------------------------------------------- /admin-ui/src/utils/createUniqueString.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by jiachenpan on 17/3/8. 3 | */ 4 | export default function createUniqueString() { 5 | const timestamp = +new Date() + '' 6 | const randomNum = parseInt((1 + Math.random()) * 65536) + '' 7 | return (+(randomNum + timestamp)).toString(32) 8 | } 9 | -------------------------------------------------------------------------------- /admin-ui/src/utils/i18n.js: -------------------------------------------------------------------------------- 1 | // translate router.meta.title, be used in breadcrumb sidebar tagsview 2 | export function generateTitle(title) { 3 | const hasKey = this.$te('route.' + title) 4 | 5 | if (hasKey) { 6 | // $t :this method from vue-i18n, inject in @/lang/index.js 7 | const translatedTitle = this.$t('route.' + title) 8 | 9 | return translatedTitle 10 | } 11 | return title 12 | } 13 | -------------------------------------------------------------------------------- /admin-ui/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 | -------------------------------------------------------------------------------- /admin-ui/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 | -------------------------------------------------------------------------------- /admin-ui/src/vendor/Export2Zip.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | require('script-loader!file-saver'); 3 | import JSZip from 'jszip' 4 | 5 | export function export_txt_to_zip(th, jsonData, txtName, zipName) { 6 | const zip = new JSZip() 7 | const txt_name = txtName || 'file' 8 | const zip_name = zipName || 'file' 9 | const data = jsonData 10 | let txtData = `${th}\r\n` 11 | data.forEach((row) => { 12 | let tempStr = '' 13 | tempStr = row.toString() 14 | txtData += `${tempStr}\r\n` 15 | }) 16 | zip.file(`${txt_name}.txt`, txtData) 17 | zip.generateAsync({ 18 | type: "blob" 19 | }).then((blob) => { 20 | saveAs(blob, `${zip_name}.zip`) 21 | }, (err) => { 22 | alert('导出失败') 23 | }) 24 | } 25 | -------------------------------------------------------------------------------- /admin-ui/src/views/layout/components/AppMain.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 24 | 25 | 34 | 35 | -------------------------------------------------------------------------------- /admin-ui/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 | -------------------------------------------------------------------------------- /admin-ui/src/views/layout/components/Sidebar/Item.vue: -------------------------------------------------------------------------------- 1 | 30 | -------------------------------------------------------------------------------- /admin-ui/src/views/layout/components/Sidebar/Link.vue: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 40 | -------------------------------------------------------------------------------- /admin-ui/src/views/layout/components/Sidebar/index.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 34 | -------------------------------------------------------------------------------- /admin-ui/src/views/layout/components/index.js: -------------------------------------------------------------------------------- 1 | export { default as Navbar } from './Navbar' 2 | export { default as Sidebar } from './Sidebar/index.vue' 3 | export { default as TagsView } from './TagsView' 4 | export { default as AppMain } from './AppMain' 5 | -------------------------------------------------------------------------------- /admin-ui/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 | -------------------------------------------------------------------------------- /admin-ui/src/views/login/authredirect.vue: -------------------------------------------------------------------------------- 1 | 11 | -------------------------------------------------------------------------------- /admin-ui/src/views/redirect/index.vue: -------------------------------------------------------------------------------- 1 | 13 | -------------------------------------------------------------------------------- /admin-ui/src/views/stat/goods.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 38 | -------------------------------------------------------------------------------- /admin-ui/src/views/stat/order.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 38 | -------------------------------------------------------------------------------- /admin-ui/src/views/stat/user.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 39 | -------------------------------------------------------------------------------- /admin-ui/static/tinymce4.7.5/plugins/emoticons/img/smiley-cool.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/static/tinymce4.7.5/plugins/emoticons/img/smiley-cool.gif -------------------------------------------------------------------------------- /admin-ui/static/tinymce4.7.5/plugins/emoticons/img/smiley-cry.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/static/tinymce4.7.5/plugins/emoticons/img/smiley-cry.gif -------------------------------------------------------------------------------- /admin-ui/static/tinymce4.7.5/plugins/emoticons/img/smiley-embarassed.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/static/tinymce4.7.5/plugins/emoticons/img/smiley-embarassed.gif -------------------------------------------------------------------------------- /admin-ui/static/tinymce4.7.5/plugins/emoticons/img/smiley-foot-in-mouth.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/static/tinymce4.7.5/plugins/emoticons/img/smiley-foot-in-mouth.gif -------------------------------------------------------------------------------- /admin-ui/static/tinymce4.7.5/plugins/emoticons/img/smiley-frown.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/static/tinymce4.7.5/plugins/emoticons/img/smiley-frown.gif -------------------------------------------------------------------------------- /admin-ui/static/tinymce4.7.5/plugins/emoticons/img/smiley-innocent.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/static/tinymce4.7.5/plugins/emoticons/img/smiley-innocent.gif -------------------------------------------------------------------------------- /admin-ui/static/tinymce4.7.5/plugins/emoticons/img/smiley-kiss.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/static/tinymce4.7.5/plugins/emoticons/img/smiley-kiss.gif -------------------------------------------------------------------------------- /admin-ui/static/tinymce4.7.5/plugins/emoticons/img/smiley-laughing.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/static/tinymce4.7.5/plugins/emoticons/img/smiley-laughing.gif -------------------------------------------------------------------------------- /admin-ui/static/tinymce4.7.5/plugins/emoticons/img/smiley-money-mouth.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/static/tinymce4.7.5/plugins/emoticons/img/smiley-money-mouth.gif -------------------------------------------------------------------------------- /admin-ui/static/tinymce4.7.5/plugins/emoticons/img/smiley-sealed.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/static/tinymce4.7.5/plugins/emoticons/img/smiley-sealed.gif -------------------------------------------------------------------------------- /admin-ui/static/tinymce4.7.5/plugins/emoticons/img/smiley-smile.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/static/tinymce4.7.5/plugins/emoticons/img/smiley-smile.gif -------------------------------------------------------------------------------- /admin-ui/static/tinymce4.7.5/plugins/emoticons/img/smiley-surprised.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/static/tinymce4.7.5/plugins/emoticons/img/smiley-surprised.gif -------------------------------------------------------------------------------- /admin-ui/static/tinymce4.7.5/plugins/emoticons/img/smiley-tongue-out.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/static/tinymce4.7.5/plugins/emoticons/img/smiley-tongue-out.gif -------------------------------------------------------------------------------- /admin-ui/static/tinymce4.7.5/plugins/emoticons/img/smiley-undecided.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/static/tinymce4.7.5/plugins/emoticons/img/smiley-undecided.gif -------------------------------------------------------------------------------- /admin-ui/static/tinymce4.7.5/plugins/emoticons/img/smiley-wink.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/static/tinymce4.7.5/plugins/emoticons/img/smiley-wink.gif -------------------------------------------------------------------------------- /admin-ui/static/tinymce4.7.5/plugins/emoticons/img/smiley-yell.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/static/tinymce4.7.5/plugins/emoticons/img/smiley-yell.gif -------------------------------------------------------------------------------- /admin-ui/static/tinymce4.7.5/skins/lightgray/fonts/tinymce-mobile.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/static/tinymce4.7.5/skins/lightgray/fonts/tinymce-mobile.woff -------------------------------------------------------------------------------- /admin-ui/static/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/static/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.eot -------------------------------------------------------------------------------- /admin-ui/static/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/static/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.ttf -------------------------------------------------------------------------------- /admin-ui/static/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/static/tinymce4.7.5/skins/lightgray/fonts/tinymce-small.woff -------------------------------------------------------------------------------- /admin-ui/static/tinymce4.7.5/skins/lightgray/fonts/tinymce.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/static/tinymce4.7.5/skins/lightgray/fonts/tinymce.eot -------------------------------------------------------------------------------- /admin-ui/static/tinymce4.7.5/skins/lightgray/fonts/tinymce.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/static/tinymce4.7.5/skins/lightgray/fonts/tinymce.ttf -------------------------------------------------------------------------------- /admin-ui/static/tinymce4.7.5/skins/lightgray/fonts/tinymce.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/static/tinymce4.7.5/skins/lightgray/fonts/tinymce.woff -------------------------------------------------------------------------------- /admin-ui/static/tinymce4.7.5/skins/lightgray/img/anchor.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/static/tinymce4.7.5/skins/lightgray/img/anchor.gif -------------------------------------------------------------------------------- /admin-ui/static/tinymce4.7.5/skins/lightgray/img/loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/static/tinymce4.7.5/skins/lightgray/img/loader.gif -------------------------------------------------------------------------------- /admin-ui/static/tinymce4.7.5/skins/lightgray/img/object.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/static/tinymce4.7.5/skins/lightgray/img/object.gif -------------------------------------------------------------------------------- /admin-ui/static/tinymce4.7.5/skins/lightgray/img/trans.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/admin-ui/static/tinymce4.7.5/skins/lightgray/img/trans.gif -------------------------------------------------------------------------------- /doc/dts-shop模型域.ndm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/doc/dts-shop模型域.ndm -------------------------------------------------------------------------------- /dts-admin-api/.gitignore: -------------------------------------------------------------------------------- 1 | /target/ 2 | /storage/ 3 | -------------------------------------------------------------------------------- /dts-admin-api/src/main/java/com/qiguliuxing/dts/admin/annotation/RequiresPermissionsDesc.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.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 | -------------------------------------------------------------------------------- /dts-admin-api/src/main/java/com/qiguliuxing/dts/admin/api/Application.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.admin.api; 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 | /** 10 | * @author DELL 11 | */ 12 | @SpringBootApplication(scanBasePackages = { "com.qiguliuxing.dts.db", "com.qiguliuxing.dts.core", 13 | "com.qiguliuxing.dts.admin" }) 14 | @MapperScan({ "com.qiguliuxing.dts.db.dao", "com.qiguliuxing.dts.db.dao.ex" }) 15 | @EnableTransactionManagement 16 | @EnableScheduling 17 | public class Application { 18 | 19 | public static void main(String[] args) { 20 | SpringApplication.run(Application.class, args); 21 | } 22 | 23 | } -------------------------------------------------------------------------------- /dts-admin-api/src/main/java/com/qiguliuxing/dts/admin/config/ShiroExceptionHandler.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.admin.config; 2 | 3 | import org.apache.shiro.authc.AuthenticationException; 4 | import org.apache.shiro.authz.AuthorizationException; 5 | import org.springframework.core.Ordered; 6 | import org.springframework.core.annotation.Order; 7 | import org.springframework.web.bind.annotation.ControllerAdvice; 8 | import org.springframework.web.bind.annotation.ExceptionHandler; 9 | import org.springframework.web.bind.annotation.ResponseBody; 10 | 11 | import com.qiguliuxing.dts.core.util.ResponseUtil; 12 | 13 | @ControllerAdvice 14 | @Order(value = Ordered.HIGHEST_PRECEDENCE) 15 | public class ShiroExceptionHandler { 16 | 17 | @ExceptionHandler(AuthenticationException.class) 18 | @ResponseBody 19 | public Object unauthenticatedHandler(AuthenticationException e) { 20 | e.printStackTrace(); 21 | return ResponseUtil.unlogin(); 22 | } 23 | 24 | @ExceptionHandler(AuthorizationException.class) 25 | @ResponseBody 26 | public Object unauthorizedHandler(AuthorizationException e) { 27 | e.printStackTrace(); 28 | return ResponseUtil.unauthz(); 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /dts-admin-api/src/main/java/com/qiguliuxing/dts/admin/dao/AccountVo.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.admin.dao; 2 | 3 | import java.io.Serializable; 4 | import java.math.BigDecimal; 5 | 6 | public class AccountVo implements Serializable { 7 | 8 | private static final long serialVersionUID = 1567048369574496965L; 9 | 10 | private Integer userId; 11 | 12 | private BigDecimal remainAmount; 13 | 14 | private BigDecimal totalAmount; 15 | 16 | public Integer getUserId() { 17 | return userId; 18 | } 19 | 20 | public void setUserId(Integer userId) { 21 | this.userId = userId; 22 | } 23 | 24 | public BigDecimal getRemainAmount() { 25 | return remainAmount; 26 | } 27 | 28 | public void setRemainAmount(BigDecimal remainAmount) { 29 | this.remainAmount = remainAmount; 30 | } 31 | 32 | public BigDecimal getTotalAmount() { 33 | return totalAmount; 34 | } 35 | 36 | public void setTotalAmount(BigDecimal totalAmount) { 37 | this.totalAmount = totalAmount; 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /dts-admin-api/src/main/java/com/qiguliuxing/dts/admin/dao/Product.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.admin.dao; 2 | 3 | import java.math.BigDecimal; 4 | 5 | public class Product { 6 | String[] specifications; 7 | BigDecimal price; 8 | Integer number; 9 | String url; 10 | 11 | public String[] getSpecifications() { 12 | return specifications; 13 | } 14 | 15 | public void setSpecifications(String[] specifications) { 16 | this.specifications = specifications; 17 | } 18 | 19 | public BigDecimal getPrice() { 20 | return price; 21 | } 22 | 23 | public void setPrice(BigDecimal price) { 24 | this.price = price; 25 | } 26 | 27 | public Integer getNumber() { 28 | return number; 29 | } 30 | 31 | public void setNumber(Integer number) { 32 | this.number = number; 33 | } 34 | 35 | public String getUrl() { 36 | return url; 37 | } 38 | 39 | public void setUrl(String url) { 40 | this.url = url; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /dts-admin-api/src/main/java/com/qiguliuxing/dts/admin/util/AdminResponseUtil.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.admin.util; 2 | 3 | import com.qiguliuxing.dts.core.util.ResponseUtil; 4 | 5 | /** 6 | * 管理后台接口枚举信息的响应 7 | * 8 | * @author CHENBO 9 | * @since 1.0.0 10 | * @QQ 623659388 11 | */ 12 | public class AdminResponseUtil extends ResponseUtil { 13 | 14 | /** 15 | * 按枚举返回错误响应结果 16 | * 17 | * @param orderUnknown 18 | * @return 19 | */ 20 | public static Object fail(AdminResponseCode responseCode) { 21 | return fail(responseCode.code(), responseCode.desc()); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /dts-admin-api/src/main/java/com/qiguliuxing/dts/admin/util/ArticleType.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.admin.util; 2 | 3 | import org.apache.commons.lang3.StringUtils; 4 | 5 | /** 6 | * 公告,通知文章等类型定义 7 | * 8 | * @author CHENBO 9 | * @since 1.0.0 10 | * @QQ 623659388 11 | * 12 | */ 13 | public enum ArticleType { 14 | 15 | NOTICE("0", "通知"), ANNOUNCE("1", "公告"); 16 | 17 | private final String type; 18 | private final String desc; 19 | 20 | ArticleType(String type, String desc) { 21 | this.type = type; 22 | this.desc = desc; 23 | } 24 | 25 | public static ArticleType getInstance(String type) { 26 | if (StringUtils.isNotBlank(type)) { 27 | for (ArticleType tmp : ArticleType.values()) { 28 | if (type.equals(tmp.type)) { 29 | return tmp; 30 | } 31 | } 32 | } 33 | return null; 34 | } 35 | 36 | public String type() { 37 | return type; 38 | } 39 | 40 | public String desc() { 41 | return desc; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /dts-admin-api/src/main/java/com/qiguliuxing/dts/admin/util/CatVo.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.admin.util; 2 | 3 | import java.util.List; 4 | 5 | @SuppressWarnings("rawtypes") 6 | public class CatVo { 7 | private Integer value = null; 8 | private String label = null; 9 | private List children = null; 10 | 11 | public Integer getValue() { 12 | return value; 13 | } 14 | 15 | public void setValue(Integer value) { 16 | this.value = value; 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 List getChildren() { 28 | return children; 29 | } 30 | 31 | public void setChildren(List children) { 32 | this.children = children; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /dts-admin-api/src/main/java/com/qiguliuxing/dts/admin/util/DtsBrandVo.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.admin.util; 2 | 3 | import java.io.Serializable; 4 | 5 | import com.qiguliuxing.dts.db.domain.DtsBrand; 6 | 7 | public class DtsBrandVo extends DtsBrand implements Serializable{ 8 | 9 | private static final long serialVersionUID = 6530090986580196500L; 10 | 11 | private Integer[] categoryIds; 12 | 13 | public Integer[] getCategoryIds() { 14 | return categoryIds; 15 | } 16 | 17 | public void setCategoryIds(Integer[] categoryIds) { 18 | this.categoryIds = categoryIds; 19 | } 20 | 21 | 22 | 23 | } 24 | -------------------------------------------------------------------------------- /dts-admin-api/src/main/java/com/qiguliuxing/dts/admin/util/PermVo.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.admin.util; 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 | -------------------------------------------------------------------------------- /dts-admin-api/src/main/java/com/qiguliuxing/dts/admin/util/Permission.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.admin.util; 2 | 3 | import org.apache.shiro.authz.annotation.RequiresPermissions; 4 | 5 | import com.qiguliuxing.dts.admin.annotation.RequiresPermissionsDesc; 6 | 7 | public class Permission { 8 | private RequiresPermissions requiresPermissions; 9 | private RequiresPermissionsDesc requiresPermissionsDesc; 10 | private String api; 11 | 12 | public RequiresPermissions getRequiresPermissions() { 13 | return requiresPermissions; 14 | } 15 | 16 | public RequiresPermissionsDesc getRequiresPermissionsDesc() { 17 | return requiresPermissionsDesc; 18 | } 19 | 20 | public void setRequiresPermissions(RequiresPermissions requiresPermissions) { 21 | this.requiresPermissions = requiresPermissions; 22 | } 23 | 24 | public void setRequiresPermissionsDesc(RequiresPermissionsDesc requiresPermissionsDesc) { 25 | this.requiresPermissionsDesc = requiresPermissionsDesc; 26 | } 27 | 28 | public String getApi() { 29 | return api; 30 | } 31 | 32 | public void setApi(String api) { 33 | this.api = api; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /dts-admin-api/src/main/java/com/qiguliuxing/dts/admin/util/StatVo.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.admin.util; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Arrays; 5 | import java.util.List; 6 | import java.util.Map; 7 | 8 | @SuppressWarnings("rawtypes") 9 | public class StatVo { 10 | private String[] columns = new String[0]; 11 | private List rows = new ArrayList<>(); 12 | 13 | public String[] getColumns() { 14 | return columns; 15 | } 16 | 17 | public void setColumns(String[] columns) { 18 | this.columns = columns; 19 | } 20 | 21 | public List getRows() { 22 | return rows; 23 | } 24 | 25 | public void setRows(List rows) { 26 | this.rows = rows; 27 | } 28 | 29 | public void add(Map... r) { 30 | rows.addAll(Arrays.asList(r)); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /dts-admin-api/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | profiles: 3 | active: @profile.active@ 4 | messages: 5 | encoding: UTF-8 6 | servlet: 7 | multipart: 8 | max-file-size: 50Mb 9 | max-request-size: 80Mb 10 | location: /tmp/tomcat_upload 11 | 12 | server: 13 | port: 8083 14 | servlet: 15 | context-path: /demo 16 | 17 | logging: 18 | level: 19 | root: ERROR 20 | org.springframework: ERROR 21 | org.mybatis: ERROR 22 | com.qiguliuxing.dts.admin: DEBUG 23 | com.qiguliuxing.dts: INFO -------------------------------------------------------------------------------- /dts-core/.gitignore: -------------------------------------------------------------------------------- 1 | /target/ 2 | -------------------------------------------------------------------------------- /dts-core/src/main/java/com/qiguliuxing/dts/core/config/AsyncConfig.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.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 | -------------------------------------------------------------------------------- /dts-core/src/main/java/com/qiguliuxing/dts/core/config/CorsConfig.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.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 | private CorsConfiguration buildConfig() { 12 | CorsConfiguration corsConfiguration = new CorsConfiguration(); 13 | corsConfiguration.addAllowedOrigin("*"); // 1 设置访问源地址 14 | corsConfiguration.addAllowedHeader("*"); // 2 设置访问源请求头 15 | corsConfiguration.addAllowedMethod("*"); // 3 设置访问源请求方法 16 | return corsConfiguration; 17 | } 18 | 19 | @Bean 20 | public CorsFilter corsFilter() { 21 | UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); 22 | source.registerCorsConfiguration("/**", buildConfig()); // 4 对接口配置跨域设置 23 | return new CorsFilter(source); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /dts-core/src/main/java/com/qiguliuxing/dts/core/config/ValidatorConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.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).configure() 16 | .addProperty("hibernate.validator.fail_fast", "true").buildValidatorFactory(); 17 | Validator validator = validatorFactory.getValidator(); 18 | 19 | return validator; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /dts-core/src/main/java/com/qiguliuxing/dts/core/express/config/ExpressAutoConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.core.express.config; 2 | 3 | import org.springframework.boot.context.properties.EnableConfigurationProperties; 4 | import org.springframework.context.annotation.Bean; 5 | import org.springframework.context.annotation.Configuration; 6 | 7 | import com.qiguliuxing.dts.core.express.ExpressService; 8 | 9 | @Configuration 10 | @EnableConfigurationProperties(ExpressProperties.class) 11 | public class ExpressAutoConfiguration { 12 | 13 | private final ExpressProperties properties; 14 | 15 | public ExpressAutoConfiguration(ExpressProperties properties) { 16 | this.properties = properties; 17 | } 18 | 19 | @Bean 20 | public ExpressService expressService() { 21 | ExpressService expressService = new ExpressService(); 22 | expressService.setProperties(properties); 23 | return expressService; 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /dts-core/src/main/java/com/qiguliuxing/dts/core/express/config/ExpressProperties.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.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 = "dts.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 | -------------------------------------------------------------------------------- /dts-core/src/main/java/com/qiguliuxing/dts/core/express/dao/Traces.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2018 bejson.com 3 | */ 4 | package com.qiguliuxing.dts.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 | } -------------------------------------------------------------------------------- /dts-core/src/main/java/com/qiguliuxing/dts/core/notify/NotifyType.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.core.notify; 2 | 3 | public enum NotifyType { 4 | PAY_SUCCEED("paySucceed"), SHIP("ship"), APPLYREFUND("applyRefund"), // 申请退款 5 | REFUND("refund"), CAPTCHA("captcha"); 6 | 7 | private String type; 8 | 9 | NotifyType(String type) { 10 | this.type = type; 11 | } 12 | 13 | public String getType() { 14 | return this.type; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /dts-core/src/main/java/com/qiguliuxing/dts/core/notify/SmsResult.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.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 | -------------------------------------------------------------------------------- /dts-core/src/main/java/com/qiguliuxing/dts/core/notify/SmsSender.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.core.notify; 2 | 3 | public interface SmsSender { 4 | 5 | /** 6 | * 发送短信息 7 | * 8 | * @param phone 9 | * 接收通知的电话号码 10 | * @param content 11 | * 短消息内容 12 | */ 13 | SmsResult send(String phone, String content); 14 | 15 | /** 16 | * 通过短信模版发送短信息 17 | * 18 | * @param phone 19 | * 接收通知的电话号码 20 | * @param templateId 21 | * 通知模板ID 22 | * @param params 23 | * 通知模版内容里的参数,类似"您的验证码为{1}"中{1}的值 24 | */ 25 | SmsResult sendWithTemplate(String phone, int templateId, String[] params); 26 | } -------------------------------------------------------------------------------- /dts-core/src/main/java/com/qiguliuxing/dts/core/storage/Storage.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.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 | * 文件输入流 19 | * @param contentLength 20 | * 文件长度 21 | * @param contentType 22 | * 文件类型 23 | * @param keyName 24 | * 文件名 25 | */ 26 | void store(InputStream inputStream, long contentLength, String contentType, String keyName); 27 | 28 | Stream loadAll(); 29 | 30 | Path load(String keyName); 31 | 32 | Resource loadAsResource(String keyName); 33 | 34 | void delete(String keyName); 35 | 36 | String generateUrl(String keyName); 37 | } -------------------------------------------------------------------------------- /dts-core/src/main/java/com/qiguliuxing/dts/core/type/BrokerageTypeEnum.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.core.type; 2 | 3 | /** 4 | * 佣金类型的枚举类 5 | * 6 | * @author CHENBO 7 | * @QQ 623659388 8 | * @since 1.0.0 9 | */ 10 | public enum BrokerageTypeEnum { 11 | 12 | SYS_APPLY((byte) 0, "系统结算自动申请"), USER_APPLY((byte) 1, "用户手工申请"), APPLY_FINISH((byte) 2, "审批通过或完成"), APPLY_FAIL((byte) 2, "审批不通过"); 13 | 14 | private Byte type; 15 | private String desc; 16 | 17 | private BrokerageTypeEnum(Byte type, String desc) { 18 | this.type = type; 19 | this.desc = desc; 20 | } 21 | 22 | public static BrokerageTypeEnum getInstance(Byte type2) { 23 | if (type2 != null) { 24 | for (BrokerageTypeEnum tmp : BrokerageTypeEnum.values()) { 25 | if (tmp.type.intValue() == type2.intValue()) { 26 | return tmp; 27 | } 28 | } 29 | } 30 | return null; 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 String getDesc() { 42 | return desc; 43 | } 44 | 45 | public void setDesc(String desc) { 46 | this.desc = desc; 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /dts-core/src/main/java/com/qiguliuxing/dts/core/type/UserTypeEnum.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.core.type; 2 | 3 | /** 4 | * 用户类型的枚举类 5 | * 6 | * @author CHENBO 7 | * @QQ 623659388 8 | * @since 1.0.0 9 | */ 10 | public enum UserTypeEnum { 11 | 12 | COMM_USER((byte) 0, "普通用户"), VIP_USER((byte) 1, "VIP"), REGIONAL_AGENCY((byte) 2, "区域代理"); 13 | 14 | private Byte level; 15 | private String desc; 16 | 17 | private UserTypeEnum(Byte level, String desc) { 18 | this.level = level; 19 | this.desc = desc; 20 | } 21 | 22 | public static UserTypeEnum getInstance(Byte level2) { 23 | if (level2 != null) { 24 | for (UserTypeEnum tmp : UserTypeEnum.values()) { 25 | if (tmp.level.intValue() == level2.intValue()) { 26 | return tmp; 27 | } 28 | } 29 | } 30 | return null; 31 | } 32 | 33 | public Byte getLevel() { 34 | return level; 35 | } 36 | 37 | public void setLevel(Byte level) { 38 | this.level = level; 39 | } 40 | 41 | public String getDesc() { 42 | return desc; 43 | } 44 | 45 | public void setDesc(String desc) { 46 | this.desc = desc; 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /dts-core/src/main/java/com/qiguliuxing/dts/core/util/CharUtil.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.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 | -------------------------------------------------------------------------------- /dts-core/src/main/java/com/qiguliuxing/dts/core/util/DateTimeUtil.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.core.util; 2 | 3 | import java.text.SimpleDateFormat; 4 | import java.time.LocalDateTime; 5 | import java.time.format.DateTimeFormatter; 6 | import java.util.Calendar; 7 | import java.util.Date; 8 | 9 | /** 10 | * 日期格式化工具类 11 | */ 12 | public class DateTimeUtil { 13 | 14 | /** 15 | * 格式 yyyy年MM月dd日 HH:mm:ss 16 | * 17 | * @param dateTime 18 | * @return 19 | */ 20 | public static String getDateTimeDisplayString(LocalDateTime dateTime) { 21 | DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss"); 22 | String strDate2 = dtf2.format(dateTime); 23 | 24 | return strDate2; 25 | } 26 | 27 | public static String getPrevMonthEndDay() { 28 | SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 29 | try { 30 | Date date = new Date(); 31 | Calendar c = Calendar.getInstance(); 32 | // 设置为指定日期 33 | c.setTime(date); 34 | // 指定日期月份减去一 35 | c.add(Calendar.MONTH, -1); 36 | // 指定日期月份减去一后的 最大天数 37 | c.set(Calendar.DATE, c.getActualMaximum(Calendar.DATE)); 38 | // 获取最终的时间 39 | Date lastDateOfPrevMonth = c.getTime(); 40 | return sdf.format(lastDateOfPrevMonth); 41 | } catch (Exception e) { 42 | return null; 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /dts-core/src/main/java/com/qiguliuxing/dts/core/validator/Order.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.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 | -------------------------------------------------------------------------------- /dts-core/src/main/java/com/qiguliuxing/dts/core/validator/OrderValidator.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.core.validator; 2 | 3 | import javax.validation.ConstraintValidator; 4 | import javax.validation.ConstraintValidatorContext; 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | 8 | public class OrderValidator implements ConstraintValidator { 9 | private List valueList; 10 | 11 | @Override 12 | public void initialize(Order order) { 13 | valueList = new ArrayList(); 14 | for (String val : order.accepts()) { 15 | valueList.add(val.toUpperCase()); 16 | } 17 | } 18 | 19 | @Override 20 | public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) { 21 | if (!valueList.contains(s.toUpperCase())) { 22 | return false; 23 | } 24 | return true; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /dts-core/src/main/java/com/qiguliuxing/dts/core/validator/Sort.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.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 | -------------------------------------------------------------------------------- /dts-core/src/main/java/com/qiguliuxing/dts/core/validator/SortValidator.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.core.validator; 2 | 3 | import javax.validation.ConstraintValidator; 4 | import javax.validation.ConstraintValidatorContext; 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | 8 | public class SortValidator implements ConstraintValidator { 9 | private List valueList; 10 | 11 | @Override 12 | public void initialize(Sort sort) { 13 | valueList = new ArrayList(); 14 | for (String val : sort.accepts()) { 15 | valueList.add(val.toUpperCase()); 16 | } 17 | } 18 | 19 | @Override 20 | public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) { 21 | if (!valueList.contains(s.toUpperCase())) { 22 | return false; 23 | } 24 | return true; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /dts-core/src/main/resources/.gitignore: -------------------------------------------------------------------------------- 1 | /application-core.yml 2 | -------------------------------------------------------------------------------- /dts-core/src/main/resources/back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/dts-core/src/main/resources/back.png -------------------------------------------------------------------------------- /dts-core/src/main/resources/back_groupon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/dts-core/src/main/resources/back_groupon.png -------------------------------------------------------------------------------- /dts-core/src/test/resources/二维码.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhou-github-name/dts-shop/6643ddde157df7c1092c82be9b8c73d9ebfd58d7/dts-core/src/test/resources/二维码.jpeg -------------------------------------------------------------------------------- /dts-dao/.gitignore: -------------------------------------------------------------------------------- 1 | /sql/ 2 | /target/ 3 | -------------------------------------------------------------------------------- /dts-dao/src/main/java/com/qiguliuxing/dts/db/dao/ex/GoodsProductMapper.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.db.dao.ex; 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 | 8 | int reduceStock(@Param("id") Integer id, @Param("num") Short num); 9 | 10 | int addBrowse(@Param("id") Integer id, @Param("num") Short num); 11 | 12 | int addSales(@Param("id") Integer id, @Param("num") Short num); 13 | } -------------------------------------------------------------------------------- /dts-dao/src/main/java/com/qiguliuxing/dts/db/dao/ex/OrderMapper.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.db.dao.ex; 2 | 3 | import org.apache.ibatis.annotations.Param; 4 | 5 | import com.qiguliuxing.dts.db.domain.DtsOrder; 6 | 7 | import java.time.LocalDateTime; 8 | 9 | public interface OrderMapper { 10 | int updateWithOptimisticLocker(@Param("lastUpdateTime") LocalDateTime lastUpdateTime, 11 | @Param("order") DtsOrder order); 12 | } -------------------------------------------------------------------------------- /dts-dao/src/main/java/com/qiguliuxing/dts/db/dao/ex/StatMapper.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.db.dao.ex; 2 | 3 | import java.util.List; 4 | import java.util.Map; 5 | 6 | @SuppressWarnings("rawtypes") 7 | public interface StatMapper { 8 | List statUser(); 9 | 10 | List statOrder(); 11 | 12 | List statGoods(); 13 | } -------------------------------------------------------------------------------- /dts-dao/src/main/java/com/qiguliuxing/dts/db/domain/UserVo.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.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 | -------------------------------------------------------------------------------- /dts-dao/src/main/java/com/qiguliuxing/dts/db/service/DtsSystemConfigService.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.db.service; 2 | 3 | import org.springframework.stereotype.Service; 4 | 5 | import com.qiguliuxing.dts.db.dao.DtsSystemMapper; 6 | import com.qiguliuxing.dts.db.domain.DtsSystem; 7 | import com.qiguliuxing.dts.db.domain.DtsSystemExample; 8 | 9 | import javax.annotation.Resource; 10 | import java.util.List; 11 | 12 | @Service 13 | public class DtsSystemConfigService { 14 | @Resource 15 | private DtsSystemMapper systemMapper; 16 | 17 | public List queryAll() { 18 | DtsSystemExample example = new DtsSystemExample(); 19 | example.or(); 20 | return systemMapper.selectByExample(example); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /dts-dao/src/main/java/com/qiguliuxing/dts/db/service/StatService.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.db.service; 2 | 3 | import java.util.List; 4 | import java.util.Map; 5 | 6 | import javax.annotation.Resource; 7 | 8 | import org.springframework.stereotype.Service; 9 | 10 | import com.qiguliuxing.dts.db.dao.ex.StatMapper; 11 | 12 | @Service 13 | @SuppressWarnings("rawtypes") 14 | public class StatService { 15 | @Resource 16 | private StatMapper statMapper; 17 | 18 | public List statUser() { 19 | return statMapper.statUser(); 20 | } 21 | 22 | public List statOrder() { 23 | return statMapper.statOrder(); 24 | } 25 | 26 | public List statGoods() { 27 | return statMapper.statGoods(); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /dts-dao/src/main/java/com/qiguliuxing/dts/db/util/CouponConstant.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.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 | -------------------------------------------------------------------------------- /dts-dao/src/main/java/com/qiguliuxing/dts/db/util/CouponUserConstant.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.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 | -------------------------------------------------------------------------------- /dts-dao/src/main/resources/com/qiguliuxing/dts/db/dao/ex/GoodsProductMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | update dts_goods_product 6 | set number = number + #{num,jdbcType=INTEGER}, update_time = now() 7 | where id = #{id,jdbcType=INTEGER} 8 | 9 | 10 | 11 | update dts_goods_product 12 | set number = number - #{num,jdbcType=INTEGER}, update_time = now() 13 | where id = #{id,jdbcType=INTEGER} and number >= #{num,jdbcType=INTEGER} 14 | 15 | 16 | 17 | update dts_goods 18 | set browse = browse + #{num,jdbcType=INTEGER}, update_time = now() 19 | where id = #{id,jdbcType=INTEGER} 20 | 21 | 22 | 23 | update dts_goods 24 | set sales = sales + #{num,jdbcType=INTEGER}, update_time = now() 25 | where id = #{id,jdbcType=INTEGER} 26 | 27 | -------------------------------------------------------------------------------- /dts-dao/src/main/resources/com/qiguliuxing/dts/db/dao/ex/StatMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 22 | 31 | -------------------------------------------------------------------------------- /dts-dao/src/test/java/com/qiguliuxing/dts/dao/AppTest.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.dao; 2 | 3 | import junit.framework.Test; 4 | import junit.framework.TestCase; 5 | import junit.framework.TestSuite; 6 | 7 | /** 8 | * Unit test for simple App. 9 | */ 10 | public class AppTest 11 | extends TestCase 12 | { 13 | /** 14 | * Create the test case 15 | * 16 | * @param testName name of the test case 17 | */ 18 | public AppTest( String testName ) 19 | { 20 | super( testName ); 21 | } 22 | 23 | /** 24 | * @return the suite of tests being tested 25 | */ 26 | public static Test suite() 27 | { 28 | return new TestSuite( AppTest.class ); 29 | } 30 | 31 | /** 32 | * Rigourous Test :-) 33 | */ 34 | public void testApp() 35 | { 36 | assertTrue( true ); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /dts-dao/src/test/java/com/qiguliuxing/dts/dao/DbConfigTest.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.dao; 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 DbConfigTest { 15 | @Autowired 16 | Environment environment; 17 | 18 | @Test 19 | public void test() { 20 | System.out.println(environment.getProperty("spring.datasource.druid.url")); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /dts-dao/src/test/java/com/qiguliuxing/dts/dao/DbTest.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.dao; 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.web.WebAppConfiguration; 8 | 9 | @WebAppConfiguration 10 | @RunWith(SpringJUnit4ClassRunner.class) 11 | @SpringBootTest 12 | public class DbTest { 13 | @Test 14 | public void test() { 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /dts-dao/src/test/java/com/qiguliuxing/dts/dao/StockTest.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.dao; 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.web.WebAppConfiguration; 9 | 10 | import com.qiguliuxing.dts.db.dao.ex.GoodsProductMapper; 11 | 12 | @WebAppConfiguration 13 | @RunWith(SpringJUnit4ClassRunner.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 | -------------------------------------------------------------------------------- /dts-wx-api/.gitignore: -------------------------------------------------------------------------------- 1 | /storage/ 2 | /target/ 3 | -------------------------------------------------------------------------------- /dts-wx-api/src/main/java/com/qiguliuxing/dts/wx/Application.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.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 | /** 10 | * 服务启动类 11 | * 12 | * @author CHENBO 13 | * @QQ:623659388 14 | */ 15 | @SpringBootApplication(scanBasePackages = { "com.qiguliuxing.dts.db", "com.qiguliuxing.dts.core", 16 | "com.qiguliuxing.dts.wx" }) 17 | @MapperScan({ "com.qiguliuxing.dts.db.dao", "com.qiguliuxing.dts.db.dao.ex" }) 18 | @EnableTransactionManagement 19 | @EnableScheduling 20 | public class Application { 21 | 22 | public static void main(String[] args) { 23 | SpringApplication.run(Application.class, args); 24 | } 25 | 26 | } -------------------------------------------------------------------------------- /dts-wx-api/src/main/java/com/qiguliuxing/dts/wx/annotation/LoginUser.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.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 | @Target(ElementType.PARAMETER) 9 | @Retention(RetentionPolicy.RUNTIME) 10 | public @interface LoginUser { 11 | 12 | } 13 | -------------------------------------------------------------------------------- /dts-wx-api/src/main/java/com/qiguliuxing/dts/wx/config/WxWebMvcConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.wx.config; 2 | 3 | import java.util.List; 4 | 5 | import org.springframework.context.annotation.Configuration; 6 | import org.springframework.web.method.support.HandlerMethodArgumentResolver; 7 | import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; 8 | 9 | import com.qiguliuxing.dts.wx.annotation.support.LoginUserHandlerMethodArgumentResolver; 10 | 11 | @Configuration 12 | public class WxWebMvcConfiguration implements WebMvcConfigurer { 13 | @Override 14 | public void addArgumentResolvers(List argumentResolvers) { 15 | argumentResolvers.add(new LoginUserHandlerMethodArgumentResolver()); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /dts-wx-api/src/main/java/com/qiguliuxing/dts/wx/dao/CaptchaItem.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.wx.dao; 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 | } -------------------------------------------------------------------------------- /dts-wx-api/src/main/java/com/qiguliuxing/dts/wx/dao/UserToken.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.wx.dao; 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 | -------------------------------------------------------------------------------- /dts-wx-api/src/main/java/com/qiguliuxing/dts/wx/dao/WxLoginInfo.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.wx.dao; 2 | 3 | import java.io.Serializable; 4 | 5 | public class WxLoginInfo implements Serializable { 6 | 7 | private static final long serialVersionUID = -7722430332896313642L; 8 | 9 | private String code; 10 | private UserInfo userInfo; 11 | private Integer shareUserId; 12 | 13 | public String getCode() { 14 | return code; 15 | } 16 | 17 | public void setCode(String code) { 18 | this.code = code; 19 | } 20 | 21 | public UserInfo getUserInfo() { 22 | return userInfo; 23 | } 24 | 25 | public void setUserInfo(UserInfo userInfo) { 26 | this.userInfo = userInfo; 27 | } 28 | 29 | public Integer getShareUserId() { 30 | return shareUserId; 31 | } 32 | 33 | public void setShareUserId(Integer shareUserId) { 34 | this.shareUserId = shareUserId; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /dts-wx-api/src/main/java/com/qiguliuxing/dts/wx/service/GetRegionService.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.wx.service; 2 | 3 | import java.util.List; 4 | 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.stereotype.Component; 7 | 8 | import com.qiguliuxing.dts.db.domain.DtsRegion; 9 | import com.qiguliuxing.dts.db.service.DtsRegionService; 10 | 11 | /** 12 | * @author qiguliuxing 13 | * @since 1.0.0 14 | * @date 2017-04-11 11:07 15 | **/ 16 | @Component 17 | public class GetRegionService { 18 | 19 | @Autowired 20 | private DtsRegionService regionService; 21 | 22 | private static List DtsRegions; 23 | 24 | protected List getDtsRegions() { 25 | if (DtsRegions == null) { 26 | createRegion(); 27 | } 28 | return DtsRegions; 29 | } 30 | 31 | private synchronized void createRegion() { 32 | if (DtsRegions == null) { 33 | DtsRegions = regionService.getAll(); 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /dts-wx-api/src/main/java/com/qiguliuxing/dts/wx/service/UserInfoService.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.wx.service; 2 | 3 | import org.springframework.beans.factory.annotation.Autowired; 4 | import org.springframework.stereotype.Service; 5 | import org.springframework.util.Assert; 6 | 7 | import com.qiguliuxing.dts.db.domain.DtsUser; 8 | import com.qiguliuxing.dts.db.service.DtsUserService; 9 | import com.qiguliuxing.dts.wx.dao.UserInfo; 10 | 11 | @Service 12 | public class UserInfoService { 13 | @Autowired 14 | private DtsUserService userService; 15 | 16 | public UserInfo getInfo(Integer userId) { 17 | DtsUser 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 | -------------------------------------------------------------------------------- /dts-wx-api/src/main/java/com/qiguliuxing/dts/wx/util/WxResponseUtil.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.wx.util; 2 | 3 | import com.qiguliuxing.dts.core.util.ResponseUtil; 4 | 5 | /** 6 | * 微信接口枚举信息的响应 7 | * 8 | * @author CHENBO 9 | * @since 1.0.0 10 | * @QQ 623659388 11 | */ 12 | public class WxResponseUtil extends ResponseUtil { 13 | 14 | /** 15 | * 按枚举返回错误响应结果 16 | * 17 | * @param orderUnknown 18 | * @return 19 | */ 20 | public static Object fail(WxResponseCode responseCode) { 21 | return fail(responseCode.code(), responseCode.desc()); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /dts-wx-api/src/main/java/com/qiguliuxing/dts/wx/web/WxIndexController.java: -------------------------------------------------------------------------------- 1 | package com.qiguliuxing.dts.wx.web; 2 | 3 | import org.springframework.web.bind.annotation.RequestMapping; 4 | import org.springframework.web.bind.annotation.RestController; 5 | 6 | import com.qiguliuxing.dts.core.util.ResponseUtil; 7 | 8 | /** 9 | * 测试服务 10 | */ 11 | @RestController 12 | @RequestMapping("/wx/index") 13 | public class WxIndexController { 14 | 15 | /** 16 | * 测试数据 17 | * 18 | * @return 测试数据 19 | */ 20 | @RequestMapping("/index") 21 | public Object index() { 22 | return ResponseUtil.ok("hello dts"); 23 | } 24 | 25 | } -------------------------------------------------------------------------------- /dts-wx-api/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | profiles: 3 | active: @profile.active@ 4 | messages: 5 | encoding: UTF-8 6 | servlet: 7 | multipart: 8 | max-file-size: 50Mb 9 | max-request-size: 80Mb 10 | location: /tmp/tomcat_upload 11 | 12 | server: 13 | port: 8080 14 | servlet: 15 | context-path: /demo 16 | 17 | logging: 18 | level: 19 | root: ERROR 20 | org.springframework: ERROR 21 | org.mybatis: ERROR 22 | com.qiguliuxing.dts.wx: DEBUG 23 | com.qiguliuxing.dts: INFO -------------------------------------------------------------------------------- /wx-mini-program/app.js: -------------------------------------------------------------------------------- 1 | var util = require('./utils/util.js'); 2 | var api = require('./config/api.js'); 3 | var user = require('./utils/user.js'); 4 | 5 | App({ 6 | onLaunch: function() { 7 | const updateManager = wx.getUpdateManager(); 8 | wx.getUpdateManager().onUpdateReady(function() { 9 | wx.showModal({ 10 | title: '更新提示', 11 | content: '新版本已经准备好,是否重启应用?', 12 | success: function(res) { 13 | if (res.confirm) { 14 | // 新的版本已经下载好,调用 applyUpdate 应用新版本并重启 15 | updateManager.applyUpdate() 16 | } 17 | } 18 | }) 19 | }) 20 | }, 21 | onShow: function(options) { 22 | user.checkLogin().then(res => { 23 | this.globalData.hasLogin = true; 24 | }).catch(() => { 25 | this.globalData.hasLogin = false; 26 | }); 27 | }, 28 | globalData: { 29 | hasLogin: false 30 | } 31 | }) -------------------------------------------------------------------------------- /wx-mini-program/lib/coupon-window/index.js: -------------------------------------------------------------------------------- 1 | const util = require('../../utils/util.js'); 2 | const api = require('../../config/api.js'); 3 | const user = require('../../utils/user.js'); 4 | 5 | var app = getApp(); 6 | 7 | Component({ 8 | properties: { 9 | window:{ 10 | type: Boolean, 11 | value: true, 12 | }, 13 | couponList:{ 14 | type:Array, 15 | value:[], 16 | } 17 | }, 18 | data: { 19 | 20 | }, 21 | attached: function () { 22 | 23 | }, 24 | methods: { 25 | close:function(){ 26 | this.triggerEvent('onColse'); 27 | }, 28 | getAllCoupon: function () { 29 | if (!app.globalData.hasLogin) { 30 | wx.navigateTo({ 31 | url: "/pages/auth/login/login" 32 | }); 33 | } 34 | util.request(api.CouponReceiveAll, null, 'POST').then(res => { 35 | if (res.errno === 0) { 36 | wx.showToast({ 37 | title: "领取成功" 38 | }); 39 | this.triggerEvent('onColse'); 40 | } 41 | else { 42 | util.showErrorToast(res.errmsg); 43 | } 44 | }) 45 | }, 46 | 47 | } 48 | }) -------------------------------------------------------------------------------- /wx-mini-program/lib/coupon-window/index.json: -------------------------------------------------------------------------------- 1 | { 2 | "usingComponents": {} 3 | } -------------------------------------------------------------------------------- /wx-mini-program/lib/coupon-window/index.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | {{item.discount}} 5 | 6 | 【{{item.desc}}】购物买{{item.min}}减{{item.discount}} 7 | 有效期:{{item.days}}天 8 | {{item.startTime}}-{{item.endTime}} 9 | 10 | 11 | 12 | 13 | 立即领取 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /wx-mini-program/lib/home/index.json: -------------------------------------------------------------------------------- 1 | { 2 | "usingComponents": {}, 3 | "component": true 4 | } -------------------------------------------------------------------------------- /wx-mini-program/lib/home/index.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /wx-mini-program/lib/home/index.wxss: -------------------------------------------------------------------------------- 1 | @import '/app.wxss'; 2 | .home{position: fixed ;top:580rpx;color: white;text-align: center;z-index:99;right:10rpx;} 3 | .home .homeCon{width:86rpx;border-radius:50rpx;padding:34rpx 0;box-sizing:border-box;transition:all 0.3s ease-in-out 0s;opacity:0;transform: scale(0);height:0rpx;color:#e93323;} 4 | .home .homeCon.on{opacity:1;transform: scale(1);height:300rpx;color:#fff;} 5 | .home .homeCon .iconfont{font-size:48rpx;} 6 | .home .pictrue{width:86rpx;height:86rpx;border-radius:50%;margin-top:20rpx;} 7 | .home .pictrue image{width:100%;height:100%;border-radius:50%;} 8 | -------------------------------------------------------------------------------- /wx-mini-program/lib/share-red-packets/index.js: -------------------------------------------------------------------------------- 1 | var app = getApp(); 2 | Component({ 3 | properties: { 4 | sharePacket:{ 5 | type:Object, 6 | value:{ 7 | isState: true, 8 | priceName:'', 9 | } 10 | } 11 | }, 12 | data: { 13 | 14 | }, 15 | attached: function () { 16 | }, 17 | methods: { 18 | closeShare:function(){ 19 | this.setData({ 20 | "sharePacket.isState": true 21 | }) 22 | }, 23 | goShare:function(){ 24 | this.triggerEvent('listenerActionSheet'); 25 | }, 26 | } 27 | }) -------------------------------------------------------------------------------- /wx-mini-program/lib/share-red-packets/index.json: -------------------------------------------------------------------------------- 1 | { 2 | "usingComponents": {}, 3 | "component": true 4 | } -------------------------------------------------------------------------------- /wx-mini-program/lib/share-red-packets/index.wxml: -------------------------------------------------------------------------------- 1 | 14 | -------------------------------------------------------------------------------- /wx-mini-program/lib/share-red-packets/index.wxss: -------------------------------------------------------------------------------- 1 | @import '/app.wxss'; 2 | .sharing-packets{position:fixed;right:30rpx;top:900rpx;z-index:5;transition:all 0.3s ease-in-out 0s;opacity:1;transform: scale(1);} 3 | .sharing-packets.on{transform: scale(0);opacity:0;} 4 | .sharing-packets .iconfont{width:44rpx;height:44rpx;border-radius:50%;text-align:center;line-height:44rpx;background-color:#999;font-size:20rpx;color:#fff;margin:0 auto;box-sizing:border-box;padding-left:1px;} 5 | .sharing-packets .line{width:2rpx;height:40rpx;background-color:#999;margin:0 auto;} 6 | .sharing-packets .sharing-con{width:187rpx;height:210rpx;position:relative;} 7 | .sharing-packets .sharing-con image{width:100%;height:100%;} 8 | .sharing-packets .sharing-con .text{position:absolute;top:30rpx;font-size:20rpx;width:100%;text-align:center;} 9 | .sharing-packets .sharing-con .text .money{font-size:32rpx;font-weight:bold;margin-top:5rpx;} 10 | .sharing-packets .sharing-con .text .money .label{font-size:20rpx;} 11 | .sharing-packets .sharing-con .text .tip{font-size:18rpx;color:#999;margin-top:5rpx;} 12 | .sharing-packets .sharing-con .text .shareBut{font-size:22rpx;color:#fff;margin-top:18rpx;height:50rpx;line-height:50rpx;} 13 | -------------------------------------------------------------------------------- /wx-mini-program/lib/zanui-weapp/capsule/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Component({ 4 | externalClasses: ['custom-class'], 5 | /** 6 | * 组件的属性列表 7 | * 用于组件自定义设置 8 | */ 9 | properties: { 10 | // 颜色状态 11 | type: { 12 | type: String, 13 | value: '' 14 | }, 15 | // 自定义颜色 16 | color: { 17 | type: String, 18 | value: '' 19 | }, 20 | // 左侧内容 21 | leftText: { 22 | type: String, 23 | value: '' 24 | }, 25 | // 右侧内容 26 | rightText: { 27 | type: String, 28 | value: '' 29 | } 30 | } 31 | }); -------------------------------------------------------------------------------- /wx-mini-program/lib/zanui-weapp/capsule/index.json: -------------------------------------------------------------------------------- 1 | { 2 | "component": true 3 | } 4 | -------------------------------------------------------------------------------- /wx-mini-program/lib/zanui-weapp/capsule/index.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | {{ leftText }} 4 | {{ rightText }} 5 | 6 | 7 | {{ leftText }} 8 | {{ rightText }} 9 | 10 | -------------------------------------------------------------------------------- /wx-mini-program/lib/zanui-weapp/capsule/index.wxss: -------------------------------------------------------------------------------- 1 | .zan-capsule { 2 | display: inline-block; 3 | font-size: 12px; 4 | vertical-align: middle; 5 | line-height: 19px; 6 | -webkit-transform: scale(0.83); 7 | transform: scale(0.83); 8 | } 9 | 10 | .zan-capsule__left, .zan-capsule__right { 11 | display: inline-block; 12 | line-height: 17px; 13 | height: 19px; 14 | vertical-align: middle; 15 | box-sizing: border-box; 16 | } 17 | 18 | .zan-capsule__left { 19 | padding: 0 2px; 20 | color: #fff; 21 | background: #999; 22 | border-radius: 2px 0 0 2px; 23 | border: 1rpx solid #999; 24 | } 25 | 26 | .zan-capsule__right { 27 | padding: 0 5px; 28 | color: #999; 29 | border-radius: 0 2px 2px 0; 30 | border: 1rpx solid #999; 31 | } 32 | 33 | .zan-capsule--danger .zan-capsule__left { 34 | color: #fff; 35 | background: #f24544; 36 | border-color: #f24544; 37 | } 38 | 39 | .zan-capsule--danger .zan-capsule__right { 40 | color: #f24544; 41 | border-color: #f24544; 42 | } 43 | -------------------------------------------------------------------------------- /wx-mini-program/pages/about/about.js: -------------------------------------------------------------------------------- 1 | // about.js 2 | var app = getApp() 3 | var util = require("../../utils/util.js"); 4 | 5 | 6 | var api = require("../../config/api.js"); 7 | Page({ 8 | 9 | /** 10 | * 页面的初始数据 11 | */ 12 | data: { 13 | load_statue: true, 14 | shopInfo: { 15 | name: '聚惠星', 16 | address: 'https://gitee.com/qiguliuxing/dts-shop', 17 | latitude: 27.4871724214, 18 | longitude: 110.8950504844, 19 | linkPhone: '19908488612', 20 | qqNumber: '686432822' 21 | }, 22 | }, 23 | 24 | /** 25 | * 生命周期函数--监听页面加载 26 | */ 27 | onLoad: function (options) { 28 | 29 | }, 30 | 31 | showLocation: function (e) { 32 | var that = this 33 | wx.openLocation({ 34 | latitude: that.data.shopInfo.latitude, 35 | longitude: that.data.shopInfo.longitude, 36 | name: that.data.shopInfo.name, 37 | address: that.data.shopInfo.address, 38 | }) 39 | }, 40 | callPhone: function (e) { 41 | var that = this 42 | wx.makePhoneCall({ 43 | phoneNumber: that.data.shopInfo.linkPhone, 44 | }) 45 | }, 46 | reLoad: function (e) { 47 | this.loadShopInfo(); 48 | } 49 | }) -------------------------------------------------------------------------------- /wx-mini-program/pages/about/about.json: -------------------------------------------------------------------------------- 1 | { 2 | "navigationBarTitleText": "关于我们", 3 | "enablePullDownRefresh": false 4 | } -------------------------------------------------------------------------------- /wx-mini-program/pages/about/about.wxss: -------------------------------------------------------------------------------- 1 | /* about.wxss */ 2 | 3 | page{ 4 | height: 100%; 5 | background-color: #F2f2f2; 6 | } 7 | .page-view{ 8 | height: 100%; 9 | } 10 | .banner-image{ 11 | width: 100%; 12 | height: 350rpx; 13 | background: #ee1; 14 | margin-bottom: 30rpx; 15 | border-bottom: solid #f2f2f2 0.5dp; 16 | } 17 | 18 | .about-item{ 19 | background: white; 20 | border-top: solid #f2f2f2 0.2rpx; 21 | border-bottom: solid #f2f2f2 0.2rpx; 22 | width: 100%; 23 | height: 100rpx; 24 | display: flex; 25 | flex-direction: row; 26 | justify-content: space-between; 27 | } 28 | 29 | .item-left{ 30 | font-size: 30rpx; 31 | margin-left: 15rpx; 32 | margin-top: auto; 33 | margin-bottom: auto; 34 | } 35 | .item-right{ 36 | 37 | margin-right: 15rpx; 38 | margin-top: auto; 39 | margin-bottom: auto; 40 | } 41 | .right-icon{ 42 | width: 40rpx; 43 | height: 40rpx; 44 | } -------------------------------------------------------------------------------- /wx-mini-program/pages/article/article.json: -------------------------------------------------------------------------------- 1 | { 2 | "navigationBarTitleText": "公告详情", 3 | "enablePullDownRefresh": false, 4 | "usingComponents": { 5 | "home": "../../lib/home/index" 6 | } 7 | } -------------------------------------------------------------------------------- /wx-mini-program/pages/article/article.wxml: -------------------------------------------------------------------------------- 1 | 2 | {{title}} 3 | 4 | 公告 5 | 新闻 6 | {{addTime}} 7 | 10000+ 8 | 9 | 10 |