Repository: newbee-ltd/newbee-mall-cloud Branch: main Commit: e2f89906e7bb Files: 225 Total size: 769.5 KB Directory structure: gitextract_bb6zddio/ ├── .gitignore ├── LICENSE ├── README.md ├── newbee-mall-cloud-common/ │ ├── pom.xml │ └── src/ │ └── main/ │ └── java/ │ └── ltd/ │ └── common/ │ └── cloud/ │ └── newbee/ │ ├── dto/ │ │ ├── PageQueryUtil.java │ │ ├── PageResult.java │ │ ├── Result.java │ │ └── ResultGenerator.java │ ├── enums/ │ │ ├── IndexConfigTypeEnum.java │ │ ├── NewBeeMallCategoryLevelEnum.java │ │ ├── NewBeeMallOrderStatusEnum.java │ │ ├── PayStatusEnum.java │ │ ├── PayTypeEnum.java │ │ └── ServiceResultEnum.java │ ├── exception/ │ │ └── NewBeeMallException.java │ ├── pojo/ │ │ ├── AdminUserToken.java │ │ └── MallUserToken.java │ └── util/ │ ├── BeanUtil.java │ ├── MD5Util.java │ ├── NewBeeMallUtils.java │ ├── NumberUtil.java │ └── SystemUtil.java ├── newbee-mall-cloud-gateway-admin/ │ ├── pom.xml │ └── src/ │ └── main/ │ ├── java/ │ │ └── ltd/ │ │ └── gateway/ │ │ └── cloud/ │ │ └── newbee/ │ │ ├── NewBeeMallCloudAdminGatewayApplication.java │ │ ├── config/ │ │ │ ├── PolymerizeSwaggerProvider.java │ │ │ └── RedisConfig.java │ │ └── filter/ │ │ └── ValidTokenGlobalFilter.java │ └── resources/ │ └── application.properties ├── newbee-mall-cloud-gateway-mall/ │ ├── pom.xml │ └── src/ │ └── main/ │ ├── java/ │ │ └── ltd/ │ │ └── gateway/ │ │ └── cloud/ │ │ └── newbee/ │ │ ├── NewBeeMallCloudMallGatewayApplication.java │ │ ├── config/ │ │ │ ├── PolymerizeSwaggerProvider.java │ │ │ └── RedisConfig.java │ │ └── filter/ │ │ └── ValidMallUserTokenGlobalFilter.java │ └── resources/ │ └── application.properties ├── newbee-mall-cloud-goods-service/ │ ├── newbee-mall-cloud-goods-api/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── ltd/ │ │ └── goods/ │ │ └── cloud/ │ │ └── newbee/ │ │ ├── dto/ │ │ │ ├── NewBeeMallGoodsDTO.java │ │ │ ├── StockNumDTO.java │ │ │ └── UpdateStockNumDTO.java │ │ └── openfeign/ │ │ └── NewBeeCloudGoodsServiceFeign.java │ ├── newbee-mall-cloud-goods-web/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── ltd/ │ │ │ └── goods/ │ │ │ └── cloud/ │ │ │ └── newbee/ │ │ │ ├── NewBeeMallCloudGoodsServiceApplication.java │ │ │ ├── config/ │ │ │ │ ├── GoodsServiceExceptionHandler.java │ │ │ │ ├── GoodsServiceSwagger3Config.java │ │ │ │ ├── GoodsServiceWebMvcConfigurer.java │ │ │ │ ├── OpenFeignConfiguration.java │ │ │ │ ├── SeataProxyConfiguration.java │ │ │ │ ├── annotation/ │ │ │ │ │ ├── TokenToAdminUser.java │ │ │ │ │ └── TokenToMallUser.java │ │ │ │ └── handler/ │ │ │ │ ├── TokenToAdminUserMethodArgumentResolver.java │ │ │ │ └── TokenToMallUserMethodArgumentResolver.java │ │ │ ├── controller/ │ │ │ │ ├── NewBeeAdminGoodsCategoryController.java │ │ │ │ ├── NewBeeAdminGoodsInfoController.java │ │ │ │ ├── NewBeeMallGoodsCategoryController.java │ │ │ │ ├── NewBeeMallGoodsController.java │ │ │ │ ├── param/ │ │ │ │ │ ├── BatchIdParam.java │ │ │ │ │ ├── GoodsAddParam.java │ │ │ │ │ ├── GoodsCategoryAddParam.java │ │ │ │ │ ├── GoodsCategoryEditParam.java │ │ │ │ │ └── GoodsEditParam.java │ │ │ │ └── vo/ │ │ │ │ ├── NewBeeMallGoodsDetailVO.java │ │ │ │ ├── NewBeeMallIndexCategoryVO.java │ │ │ │ ├── NewBeeMallSearchGoodsVO.java │ │ │ │ ├── SecondLevelCategoryVO.java │ │ │ │ └── ThirdLevelCategoryVO.java │ │ │ ├── dao/ │ │ │ │ ├── GoodsCategoryMapper.java │ │ │ │ └── NewBeeMallGoodsMapper.java │ │ │ ├── entity/ │ │ │ │ ├── GoodsCategory.java │ │ │ │ ├── LoginAdminUser.java │ │ │ │ ├── NewBeeMallGoods.java │ │ │ │ ├── StockNumDTO.java │ │ │ │ └── UpdateStockNumDTO.java │ │ │ └── service/ │ │ │ ├── NewBeeMallCategoryService.java │ │ │ ├── NewBeeMallGoodsService.java │ │ │ └── impl/ │ │ │ ├── NewBeeMallCategoryServiceImpl.java │ │ │ └── NewBeeMallGoodsServiceImpl.java │ │ └── resources/ │ │ ├── application.properties │ │ ├── logback.xml │ │ └── mapper/ │ │ ├── GoodsCategoryMapper.xml │ │ └── NewBeeMallGoodsMapper.xml │ └── pom.xml ├── newbee-mall-cloud-order-service/ │ ├── newbee-mall-cloud-order-api/ │ │ └── pom.xml │ ├── newbee-mall-cloud-order-web/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── ltd/ │ │ │ └── order/ │ │ │ └── cloud/ │ │ │ └── newbee/ │ │ │ ├── NewBeeMallCloudOrderServiceApplication.java │ │ │ ├── config/ │ │ │ │ ├── OpenFeignConfiguration.java │ │ │ │ ├── OrderServiceExceptionHandler.java │ │ │ │ ├── OrderServiceSwagger3Config.java │ │ │ │ ├── OrderServiceWebMvcConfigurer.java │ │ │ │ ├── SeataProxyConfiguration.java │ │ │ │ ├── annotation/ │ │ │ │ │ ├── TokenToAdminUser.java │ │ │ │ │ └── TokenToMallUser.java │ │ │ │ └── handler/ │ │ │ │ ├── TokenToAdminUserMethodArgumentResolver.java │ │ │ │ └── TokenToMallUserMethodArgumentResolver.java │ │ │ ├── controller/ │ │ │ │ ├── NewBeeAdminOrderController.java │ │ │ │ ├── NewBeeMallOrderController.java │ │ │ │ ├── NewBeeMallUserAddressController.java │ │ │ │ ├── param/ │ │ │ │ │ ├── BatchIdParam.java │ │ │ │ │ ├── SaveMallUserAddressParam.java │ │ │ │ │ ├── SaveOrderParam.java │ │ │ │ │ └── UpdateMallUserAddressParam.java │ │ │ │ └── vo/ │ │ │ │ ├── NewBeeMallOrderDetailVO.java │ │ │ │ ├── NewBeeMallOrderItemVO.java │ │ │ │ ├── NewBeeMallOrderListVO.java │ │ │ │ └── NewBeeMallUserAddressVO.java │ │ │ ├── dao/ │ │ │ │ ├── MallUserAddressMapper.java │ │ │ │ ├── NewBeeMallOrderAddressMapper.java │ │ │ │ ├── NewBeeMallOrderItemMapper.java │ │ │ │ └── NewBeeMallOrderMapper.java │ │ │ ├── entity/ │ │ │ │ ├── LoginAdminUser.java │ │ │ │ ├── MallUserAddress.java │ │ │ │ ├── NewBeeMallOrder.java │ │ │ │ ├── NewBeeMallOrderAddress.java │ │ │ │ └── NewBeeMallOrderItem.java │ │ │ └── service/ │ │ │ ├── NewBeeMallOrderService.java │ │ │ ├── NewBeeMallUserAddressService.java │ │ │ └── impl/ │ │ │ ├── NewBeeMallOrderServiceImpl.java │ │ │ └── NewBeeMallUserAddressServiceImpl.java │ │ └── resources/ │ │ ├── application.properties │ │ ├── logback.xml │ │ └── mapper/ │ │ ├── MallUserAddressMapper.xml │ │ ├── NewBeeMallOrderAddressMapper.xml │ │ ├── NewBeeMallOrderItemMapper.xml │ │ └── NewBeeMallOrderMapper.xml │ └── pom.xml ├── newbee-mall-cloud-recommend-service/ │ ├── newbee-mall-cloud-recommend-api/ │ │ └── pom.xml │ ├── newbee-mall-cloud-recommend-web/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── ltd/ │ │ │ └── recommend/ │ │ │ └── cloud/ │ │ │ └── newbee/ │ │ │ ├── NewBeeMallCloudRecommendServiceApplication.java │ │ │ ├── config/ │ │ │ │ ├── OpenFeignConfiguration.java │ │ │ │ ├── RecommendServiceExceptionHandler.java │ │ │ │ ├── RecommendServiceSwagger3Config.java │ │ │ │ ├── RecommendServiceWebMvcConfigurer.java │ │ │ │ ├── annotation/ │ │ │ │ │ └── TokenToAdminUser.java │ │ │ │ └── handler/ │ │ │ │ └── TokenToAdminUserMethodArgumentResolver.java │ │ │ ├── controller/ │ │ │ │ ├── NewBeeAdminCarouselController.java │ │ │ │ ├── NewBeeAdminIndexConfigController.java │ │ │ │ ├── NewBeeMallIndexController.java │ │ │ │ ├── param/ │ │ │ │ │ ├── BatchIdParam.java │ │ │ │ │ ├── CarouselAddParam.java │ │ │ │ │ ├── CarouselEditParam.java │ │ │ │ │ ├── IndexConfigAddParam.java │ │ │ │ │ └── IndexConfigEditParam.java │ │ │ │ └── vo/ │ │ │ │ ├── IndexInfoVO.java │ │ │ │ ├── NewBeeMallIndexCarouselVO.java │ │ │ │ ├── NewBeeMallIndexCategoryVO.java │ │ │ │ ├── NewBeeMallIndexConfigGoodsVO.java │ │ │ │ ├── SecondLevelCategoryVO.java │ │ │ │ └── ThirdLevelCategoryVO.java │ │ │ ├── dao/ │ │ │ │ ├── CarouselMapper.java │ │ │ │ └── IndexConfigMapper.java │ │ │ ├── entity/ │ │ │ │ ├── Carousel.java │ │ │ │ ├── IndexConfig.java │ │ │ │ └── LoginAdminUser.java │ │ │ └── service/ │ │ │ ├── NewBeeMallCarouselService.java │ │ │ ├── NewBeeMallIndexConfigService.java │ │ │ └── impl/ │ │ │ ├── NewBeeMallCarouselServiceImpl.java │ │ │ └── NewBeeMallIndexConfigServiceImpl.java │ │ └── resources/ │ │ ├── application.properties │ │ ├── logback.xml │ │ └── mapper/ │ │ ├── CarouselMapper.xml │ │ └── IndexConfigMapper.xml │ └── pom.xml ├── newbee-mall-cloud-shop-cart-service/ │ ├── newbee-mall-cloud-shop-cart-api/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── ltd/ │ │ └── shopcart/ │ │ └── cloud/ │ │ └── newbee/ │ │ ├── dto/ │ │ │ └── NewBeeMallShoppingCartItemDTO.java │ │ └── openfeign/ │ │ └── NewBeeCloudShopCartServiceFeign.java │ ├── newbee-mall-cloud-shop-cart-web/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── ltd/ │ │ │ └── shopcart/ │ │ │ └── cloud/ │ │ │ └── newbee/ │ │ │ ├── NewBeeMallCloudShopCartServiceApplication.java │ │ │ ├── config/ │ │ │ │ ├── OpenFeignConfiguration.java │ │ │ │ ├── SeataProxyConfiguration.java │ │ │ │ ├── ShopCartServiceExceptionHandler.java │ │ │ │ ├── ShopCartServiceSwagger3Config.java │ │ │ │ ├── ShopCartServiceWebMvcConfigurer.java │ │ │ │ ├── annotation/ │ │ │ │ │ └── TokenToMallUser.java │ │ │ │ └── handler/ │ │ │ │ └── TokenToMallUserMethodArgumentResolver.java │ │ │ ├── controller/ │ │ │ │ ├── NewBeeMallShoppingCartController.java │ │ │ │ ├── param/ │ │ │ │ │ ├── SaveCartItemParam.java │ │ │ │ │ └── UpdateCartItemParam.java │ │ │ │ └── vo/ │ │ │ │ └── NewBeeMallShoppingCartItemVO.java │ │ │ ├── dao/ │ │ │ │ └── NewBeeMallShoppingCartItemMapper.java │ │ │ ├── entity/ │ │ │ │ └── NewBeeMallShoppingCartItem.java │ │ │ └── service/ │ │ │ ├── NewBeeMallShoppingCartService.java │ │ │ └── impl/ │ │ │ └── NewBeeMallShoppingCartServiceImpl.java │ │ └── resources/ │ │ ├── application.properties │ │ ├── logback.xml │ │ └── mapper/ │ │ └── NewBeeMallShoppingCartItemMapper.xml │ └── pom.xml ├── newbee-mall-cloud-user-service/ │ ├── newbee-mall-cloud-user-api/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── ltd/ │ │ └── user/ │ │ └── cloud/ │ │ └── newbee/ │ │ ├── dto/ │ │ │ └── MallUserDTO.java │ │ └── openfeign/ │ │ └── NewBeeCloudUserServiceFeign.java │ ├── newbee-mall-cloud-user-web/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── ltd/ │ │ │ └── user/ │ │ │ └── cloud/ │ │ │ └── newbee/ │ │ │ ├── NewBeeMallCloudUserServiceApplication.java │ │ │ ├── config/ │ │ │ │ ├── RedisConfig.java │ │ │ │ ├── UserServiceExceptionHandler.java │ │ │ │ ├── UserServiceWebMvcConfigurer.java │ │ │ │ ├── UserSwagger3Config.java │ │ │ │ ├── annotation/ │ │ │ │ │ ├── TokenToAdminUser.java │ │ │ │ │ └── TokenToMallUser.java │ │ │ │ └── handler/ │ │ │ │ ├── TokenToAdminUserMethodArgumentResolver.java │ │ │ │ └── TokenToMallUserMethodArgumentResolver.java │ │ │ ├── controller/ │ │ │ │ ├── NewBeeMallCloudAdminUserController.java │ │ │ │ ├── NewBeeMallCloudPersonalController.java │ │ │ │ ├── param/ │ │ │ │ │ ├── AdminLoginParam.java │ │ │ │ │ ├── MallUserLoginParam.java │ │ │ │ │ ├── MallUserRegisterParam.java │ │ │ │ │ ├── MallUserUpdateParam.java │ │ │ │ │ ├── UpdateAdminNameParam.java │ │ │ │ │ └── UpdateAdminPasswordParam.java │ │ │ │ └── vo/ │ │ │ │ └── NewBeeMallUserVO.java │ │ │ ├── dao/ │ │ │ │ ├── AdminUserMapper.java │ │ │ │ └── MallUserMapper.java │ │ │ ├── entity/ │ │ │ │ ├── AdminUser.java │ │ │ │ └── MallUser.java │ │ │ └── service/ │ │ │ ├── AdminUserService.java │ │ │ ├── NewBeeMallUserService.java │ │ │ └── impl/ │ │ │ ├── AdminUserServiceImpl.java │ │ │ └── NewBeeMallUserServiceImpl.java │ │ └── resources/ │ │ ├── application.properties │ │ ├── logback.xml │ │ └── mapper/ │ │ ├── AdminUserMapper.xml │ │ └── MallUserMapper.xml │ └── pom.xml ├── pom.xml └── static-files/ ├── newbee_mall_cloud_cart_db.sql ├── newbee_mall_cloud_goods_db.sql ├── newbee_mall_cloud_order_db.sql ├── newbee_mall_cloud_recommend_db.sql └── newbee_mall_cloud_user_db.sql ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ /target/ !.mvn/wrapper/maven-wrapper.jar ### STS ### .apt_generated .classpath .factorypath .project .settings .springBeans .sts4-cache ### IntelliJ IDEA ### .idea *.iws *.iml *.ipr ### NetBeans ### /nbproject/private/ /build/ /nbbuild/ /dist/ /nbdist/ /.nb-gradle/ ================================================ FILE: LICENSE ================================================ GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . ================================================ FILE: README.md ================================================ ![newbee-mall-cloud-alibaba](./static-files/newbee-mall-cloud-alibaba-l.png) ![Build Status](https://img.shields.io/badge/build-passing-green.svg) ![Version 4.0.0](https://img.shields.io/badge/version-4.0.0-yellow.svg) [![License](https://img.shields.io/badge/license-GPL3.0-blue.svg)](https://github.com/newbee-ltd/newbee-mall-cloud/blob/main/LICENSE) newbee-mall-cloud 项目是新蜂商城 newbee-mall 项目的微服务版本,一款基于 Spring Cloud Alibaba + Nacos + Sentinel + Seata + Spring Cloud Gateway + OpenFeign + Spring Cloud Seluth + Zipkin + ELK 等技术的大型微服务实战项目。 当前分支的 Spring Boot 版本为 2.6.3,Spring Cloud 版本为 2021.0.1,想要学习和使用其它版本可以直接点击下方的分支名称跳转至对应的仓库分支中。 | 分支名称 | Spring Boot Version | Spring Cloud Version | Spring Cloud Alibaba Version | |:----------------------------------------------------------------------------------------------:|:----------------:|:----------------:|:----------------:| | [main](https://github.com/newbee-ltd/newbee-mall-cloud) | 2.6.3 | 2021.0.1 | 2021.0.1.0 | | [2022.x](https://github.com/newbee-ltd/newbee-mall-cloud/tree/spring-cloud-2022.x) | 3.0.2 | 2022.0.0 | 2022.0.0.0 | 2019 年开源了第一个单体版本,由最初新蜂商城单体项目,逐步过渡到前后端分离和微服务架构的项目,到现在已经“开枝散叶”,成长为一系列的项目集合,下图为新蜂商城项目由 2019 年至 2023 年的开源历程。由基础项目慢慢优化,不断地增加技术栈,让用户学习到越来越多知识点的同时,对开源作者的技术提升也是一个很大的帮助。 ![newbee-mall-course-2023](./static-files/newbee-mall-course-2023.png) **坚持不易,如果觉得项目还不错的话可以给项目一个 Star 吧,也是对我自 2019 年开始一直更新这个项目的一种鼓励啦,谢谢各位的支持。** | 项目名称 | 仓库地址 | 备注 | | :------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | | newbee-mall | [newbee-mall in GitHub](https://github.com/newbee-ltd/newbee-mall)
[newbee-mall in Gitee](https://gitee.com/newbee-ltd/newbee-mall) | 初始版本、Spring Boot、Thymeleaf、MyBatis、MySQL | | newbee-mall-plus | [newbee-mall-plus in GitHub](https://github.com/newbee-ltd/newbee-mall-plus)
[newbee-mall-plus in Gitee](https://gitee.com/newbee-ltd/newbee-mall-plus) | 升级版本、优惠券、秒杀、支付、Spring Boot、Thymeleaf、MyBatis、MySQL、Redis | | newbee-mall-cloud | [newbee-mall-cloud in GitHub](https://github.com/newbee-ltd/newbee-mall-cloud)
[newbee-mall-cloud in Gitee](https://gitee.com/newbee-ltd/newbee-mall-cloud) | 微服务版本、分布式事务、Spring Cloud Alibaba、Nacos、Sentinel、OpenFeign、Seata | | newbee-mall-api | [newbee-mall-api in GitHub](https://github.com/newbee-ltd/newbee-mall-api)
[newbee-mall-api in Gitee](https://gitee.com/newbee-ltd/newbee-mall-api) | 前后端分离、Spring Boot、MyBatis、Swagger、MySQL | | newbee-mall-api-go | [newbee-mall-api-go in GitHub](https://github.com/newbee-ltd/newbee-mall-api-go)
[newbee-mall-api-go in Gitee](https://gitee.com/newbee-ltd/newbee-mall-api-go) | 前后端分离、Go、Gin、MySQL | | newbee-mall-vue-app | [newbee-mall-vue-app in GitHub](https://github.com/newbee-ltd/newbee-mall-vue-app)
[newbee-mall-vue-app in Gitee](https://gitee.com/newbee-ltd/newbee-mall-vue-app) | 前后端分离、Vue2、Vant | | newbee-mall-vue3-app | [newbee-mall-vue3-app in GitHub](https://github.com/newbee-ltd/newbee-mall-vue3-app)
[newbee-mall-vue3-app in Gitee](https://gitee.com/newbee-ltd/newbee-mall-vue3-app) | 前后端分离、Vue3、Vue-Router4、Pinia、Vant4 | | vue3-admin | [vue3-admin in GitHub](https://github.com/newbee-ltd/vue3-admin)
[vue3-admin in Gitee](https://gitee.com/newbee-ltd/vue3-admin) | 前后端分离、Vue3、Element-Plus、Vue-Router4、Vite | ## 技术选型 当前分支下的开发框架选择如下所示。 | 开发框架 | 版本 | | :----------------: | :----------------: | | Spring Boot | 2.6.3 | | Spring Cloud | 2021.0.1 | | Spring Cloud Alibaba | 2021.0.1.0 | | MyBatis | 3.5.9 | | Swagger | 3.0.0 | | Lombok | 1.18.16 | 当前分支下的微服务组件技术选型如下所示。 | 技术 | 组件实现 | 版本 | 备注 | | :----------------: | :-----------------------------: |:------:| :----: | | 服务注册与服务发现 | Nacos | 1.4.2 | 已整合 | | 配置中心 | Nacos | 1.4.2 | 已整合 | | 服务通信 | Open Feign | 3.1.1 | 已整合 | | 负载均衡器 | Spring Cloud Loadbalancer | 3.1.1 | 已整合 | | 服务网关 | Spring Cloud Gateway | 3.1.1 | 已整合 | | 断路器 | Sentinel | 1.8.4 | 已整合 | | 链路追踪 | Spring Cloud Sleuth、Zipkin | 3.1.1 | 已整合 | | 分布式事务 | Seata | 1.4.2 | 已整合 | | 日志中心 | ElasticSearch、Logstash、Kibana | 7.17.8 | 已整合 | ![technology-selection](./static-files/newbee-mall-cloud-technology-selection.png) ## 架构图简版 ![simple-architecture](./static-files/newbee-mall-cloud-architecture.png) ## 开发及部署文档 1. [**Spring Cloud Alibaba 项目实战:点亮微服务技能点!**](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 2. [项目须知和课程约定](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 3. [漫谈微服务架构(一)](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 4. [漫谈微服务架构(二)](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 5. [漫谈微服务架构(三)](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 6. [微服务落地一站式解决方案——Spring Cloud](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 7. [实战基础1-代码运行环境及开发工具介绍](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 8. [实战基础2-Spring Boot 开发介绍及Spring Cloud Alibaba模板项目构建](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 9. [服务通信基础讲解](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 10. [微服务架构中的服务治理](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 11. [Nacos安装与配置](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 12. [Nacos整合之服务注册编码实践](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 13. [Nacos整合之服务发现编码实践](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 13. [(补充章节)谈一谈配置中心](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 13. [(补充章节)整合Nacos配置中心编码实践](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 13. [(补充章节)配置动态刷新及多配置读取编码实践](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 14. [服务通信之负载均衡器](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 15. [负载均衡器的源码分析及自定义负载均衡算法](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 16. [服务治理与服务通信总结](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 17. [OpenFeign介绍与整合](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 18. [OpenFeign参数传递编码实践](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 19. [服务网关之Spring Cloud Gateway](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 20. [整合Spring Cloud Gateway编码实践](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 21. [服务网关Spring Cloud Gateway之Predicate(断言)](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 22. [服务网关Spring Cloud Gateway之Filter(过滤器)](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 23. [微服务最终实战项目的启动和运行注意事项](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 24. [最终实战项目的功能介绍与功能演示](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 25. [分布式事务问题演示](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 26. [分布式事务解决方案及Seata搭建](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 27. [整合Seata编码实践](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 28. [Seata的运行流程分析](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 29. [服务容错之限流与熔断](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 30. [服务容错之Sentinel限流配置实践](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 31. [服务容错之Sentinel降级熔断配置实践](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 32. [链路追踪之Sleuth+Zipkin整合](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 33. [从零到一搭建微服务项目编码实战(一)](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 34. [从零到一搭建微服务项目编码实战(二)](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 35. [从零到一搭建微服务项目编码实战(三)](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 36. [从零到一搭建微服务项目编码实战(四)](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 37. [从零到一搭建微服务项目编码实战(五)](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 38. [从零到一搭建微服务项目编码实战(六)](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 39. [从零到一搭建微服务项目编码实战(七)](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 40. [从零到一搭建微服务项目编码实战(八)](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 41. [从零到一搭建微服务项目编码实战(九)](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 42. [从零到一搭建微服务项目编码实战(十)](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 43. [从零到一搭建微服务项目编码实战(十一)](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 44. [从零到一搭建微服务项目编码实战(十二)](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 45. [从零到一搭建微服务项目编码实战(十三)](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 46. [从零到一搭建微服务项目编码实战(十四)](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 47. [从零到一搭建微服务项目编码实战(十五)](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 49. [(补充章节)Spring Cloud Gateway聚合Swagger接口](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 50. [(补充章节)微服务架构实战项目中整合Seata](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 51. [(补充章节)微服务架构实战项目打包及部署](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 52. [(补充章节)微服务架构实战项目中整合Sentinel](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 53. [(补充章节)微服务架构实战项目中整合Seluth、Zipkin](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 54. [(补充章节)链路追踪之ELK日志中心搭建](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 55. [(补充章节)微服务架构实战项目中整合ELK日志中心](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) 55. [课程总结](https://juejin.cn/book/7085254558678515742?suid=1996368849416216&source=android) ## 联系作者 关注公众号:**程序员十三**,回复"勾搭"进群交流。 ![wx-gzh](https://newbee-mall.oss-cn-beijing.aliyuncs.com/wx-gzh/%E7%A8%8B%E5%BA%8F%E5%91%98%E5%8D%81%E4%B8%89-%E5%85%AC%E4%BC%97%E5%8F%B7.png) > 大家有任何问题或者建议都可以在 [issues](https://github.com/newbee-ltd/newbee-mall-cloud/issues) 中反馈给我,我会慢慢完善这个项目。 - 我的邮箱:2449207463@qq.com - QQ技术交流群:791509631 > newbee-mall-cloud 在 GitHub 和国内的码云都创建了代码仓库,如果有人访问 GitHub 比较慢的话,建议在 Gitee 上查看该项目,两个仓库会保持同步更新。 - [newbee-mall-cloud in GitHub](https://github.com/newbee-ltd/newbee-mall-cloud) - [newbee-mall-cloud in Gitee](https://gitee.com/newbee-ltd/newbee-mall-cloud) ## 软件著作权 本系统已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! ## 感谢 - [spring-projects](https://github.com/spring-projects/spring-boot) - [spring-cloud](https://github.com/spring-cloud) - [spring-cloud-alibaba](https://github.com/alibaba/spring-cloud-alibaba) - [alibaba](https://github.com/alibaba) - [seata](https://github.com/seata/seata) - [elasticsearch](https://github.com/elastic/elasticsearch) - [mybatis](https://github.com/mybatis/mybatis-3) - [projectlombok](https://github.com/projectlombok/lombok) - [swagger-api](https://github.com/swagger-api) ================================================ FILE: newbee-mall-cloud-common/pom.xml ================================================ 4.0.0 ltd.newbee.cloud newbee-mall-cloud-common 0.0.1-SNAPSHOT jar newbee-mall-cloud-common 公共模块 ltd.newbee.cloud newbee-mall-cloud 0.0.1-SNAPSHOT 1.8 org.projectlombok lombok ${lombok.version} provided org.springframework spring-beans io.swagger swagger-annotations 1.5.20 compile ================================================ FILE: newbee-mall-cloud-common/src/main/java/ltd/common/cloud/newbee/dto/PageQueryUtil.java ================================================ package ltd.common.cloud.newbee.dto; import java.util.LinkedHashMap; import java.util.Map; /** * 分页查询参数 * * @author 13 * @qq交流群 796794009 * @email 2449207463@qq.com * @link https://github.com/newbee-ltd */ public class PageQueryUtil extends LinkedHashMap { //当前页码 private int page; //每页条数 private int limit; public PageQueryUtil(Map params) { this.putAll(params); //分页参数 this.page = Integer.parseInt(params.get("page").toString()); this.limit = Integer.parseInt(params.get("limit").toString()); this.put("start", (page - 1) * limit); this.put("page", page); this.put("limit", limit); } public int getPage() { return page; } public void setPage(int page) { this.page = page; } public int getLimit() { return limit; } public void setLimit(int limit) { this.limit = limit; } @Override public String toString() { return "PageUtil{" + "page=" + page + ", limit=" + limit + '}'; } } ================================================ FILE: newbee-mall-cloud-common/src/main/java/ltd/common/cloud/newbee/dto/PageResult.java ================================================ package ltd.common.cloud.newbee.dto; import io.swagger.annotations.ApiModelProperty; import java.io.Serializable; import java.util.List; /** * 分页工具类 * * @author 13 * @qq交流群 796794009 * @email 2449207463@qq.com * @link https://github.com/newbee-ltd */ public class PageResult implements Serializable { @ApiModelProperty("总记录数") private int totalCount; @ApiModelProperty("每页记录数") private int pageSize; @ApiModelProperty("总页数") private int totalPage; @ApiModelProperty("当前页数") private int currPage; @ApiModelProperty("列表数据") private List list; /** * 分页 * * @param list 列表数据 * @param totalCount 总记录数 * @param pageSize 每页记录数 * @param currPage 当前页数 */ public PageResult(List list, int totalCount, int pageSize, int currPage) { this.list = list; this.totalCount = totalCount; this.pageSize = pageSize; this.currPage = currPage; this.totalPage = (int) Math.ceil((double) totalCount / pageSize); } public int getTotalCount() { return totalCount; } public void setTotalCount(int totalCount) { this.totalCount = totalCount; } public int getPageSize() { return pageSize; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } public int getTotalPage() { return totalPage; } public void setTotalPage(int totalPage) { this.totalPage = totalPage; } public int getCurrPage() { return currPage; } public void setCurrPage(int currPage) { this.currPage = currPage; } public List getList() { return list; } public void setList(List list) { this.list = list; } } ================================================ FILE: newbee-mall-cloud-common/src/main/java/ltd/common/cloud/newbee/dto/Result.java ================================================ package ltd.common.cloud.newbee.dto; import io.swagger.annotations.ApiModelProperty; import java.io.Serializable; /** * @author 13 * @qq交流群 796794009 * @email 2449207463@qq.com * @link https://github.com/newbee-ltd */ public class Result implements Serializable { private static final long serialVersionUID = 1L; //业务码,比如成功、失败、权限不足等 code,可自行定义 @ApiModelProperty("返回码") private int resultCode; //返回信息,后端在进行业务处理后返回给前端一个提示信息,可自行定义 @ApiModelProperty("返回信息") private String message; //数据结果,泛型,可以是列表、单个对象、数字、布尔值等 @ApiModelProperty("返回数据") private T data; public Result() { } public Result(int resultCode, String message) { this.resultCode = resultCode; this.message = message; } public int getResultCode() { return resultCode; } public void setResultCode(int resultCode) { this.resultCode = resultCode; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public T getData() { return data; } public void setData(T data) { this.data = data; } @Override public String toString() { return "Result{" + "resultCode=" + resultCode + ", message='" + message + '\'' + ", data=" + data + '}'; } } ================================================ FILE: newbee-mall-cloud-common/src/main/java/ltd/common/cloud/newbee/dto/ResultGenerator.java ================================================ package ltd.common.cloud.newbee.dto; import org.springframework.util.StringUtils; /** * 响应结果生成工具 * * @author 13 * @qq交流群 796794009 * @email 2449207463@qq.com * @link https://github.com/newbee-ltd */ public class ResultGenerator { private static final String DEFAULT_SUCCESS_MESSAGE = "SUCCESS"; private static final String DEFAULT_FAIL_MESSAGE = "FAIL"; private static final int RESULT_CODE_SUCCESS = 200; private static final int RESULT_CODE_SERVER_ERROR = 500; public static Result genSuccessResult() { Result result = new Result(); result.setResultCode(RESULT_CODE_SUCCESS); result.setMessage(DEFAULT_SUCCESS_MESSAGE); return result; } public static Result genSuccessResult(String message) { Result result = new Result(); result.setResultCode(RESULT_CODE_SUCCESS); result.setMessage(message); return result; } public static Result genSuccessResult(Object data) { Result result = new Result(); result.setResultCode(RESULT_CODE_SUCCESS); result.setMessage(DEFAULT_SUCCESS_MESSAGE); result.setData(data); return result; } public static Result genFailResult(String message) { Result result = new Result(); result.setResultCode(RESULT_CODE_SERVER_ERROR); if (!StringUtils.hasText(message)) { result.setMessage(DEFAULT_FAIL_MESSAGE); } else { result.setMessage(message); } return result; } public static Result genErrorResult(int code, String message) { Result result = new Result(); result.setResultCode(code); result.setMessage(message); return result; } } ================================================ FILE: newbee-mall-cloud-common/src/main/java/ltd/common/cloud/newbee/enums/IndexConfigTypeEnum.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.common.cloud.newbee.enums; /** * @author 13 * @qq交流群 796794009 * @email 2449207463@qq.com * @link https://github.com/newbee-ltd * @apiNote 首页配置项 1-搜索框热搜 2-搜索下拉框热搜 3-(首页)热销商品 4-(首页)新品上线 5-(首页)为你推荐 */ public enum IndexConfigTypeEnum { DEFAULT(0, "DEFAULT"), INDEX_SEARCH_HOTS(1, "INDEX_SEARCH_HOTS"), INDEX_SEARCH_DOWN_HOTS(2, "INDEX_SEARCH_DOWN_HOTS"), INDEX_GOODS_HOT(3, "INDEX_GOODS_HOTS"), INDEX_GOODS_NEW(4, "INDEX_GOODS_NEW"), INDEX_GOODS_RECOMMOND(5, "INDEX_GOODS_RECOMMOND"); private int type; private String name; IndexConfigTypeEnum(int type, String name) { this.type = type; this.name = name; } public static IndexConfigTypeEnum getIndexConfigTypeEnumByType(int type) { for (IndexConfigTypeEnum indexConfigTypeEnum : IndexConfigTypeEnum.values()) { if (indexConfigTypeEnum.getType() == type) { return indexConfigTypeEnum; } } return DEFAULT; } public int getType() { return type; } public void setType(int type) { this.type = type; } public String getName() { return name; } public void setName(String name) { this.name = name; } } ================================================ FILE: newbee-mall-cloud-common/src/main/java/ltd/common/cloud/newbee/enums/NewBeeMallCategoryLevelEnum.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.common.cloud.newbee.enums; /** * @author 13 * @qq交流群 796794009 * @email 2449207463@qq.com * @link https://github.com/newbee-ltd * @apiNote 分类级别 */ public enum NewBeeMallCategoryLevelEnum { DEFAULT(0, "ERROR"), LEVEL_ONE(1, "一级分类"), LEVEL_TWO(2, "二级分类"), LEVEL_THREE(3, "三级分类"); private int level; private String name; NewBeeMallCategoryLevelEnum(int level, String name) { this.level = level; this.name = name; } public static NewBeeMallCategoryLevelEnum getNewBeeMallOrderStatusEnumByLevel(int level) { for (NewBeeMallCategoryLevelEnum newBeeMallCategoryLevelEnum : NewBeeMallCategoryLevelEnum.values()) { if (newBeeMallCategoryLevelEnum.getLevel() == level) { return newBeeMallCategoryLevelEnum; } } return DEFAULT; } public int getLevel() { return level; } public void setLevel(int level) { this.level = level; } public String getName() { return name; } public void setName(String name) { this.name = name; } } ================================================ FILE: newbee-mall-cloud-common/src/main/java/ltd/common/cloud/newbee/enums/NewBeeMallOrderStatusEnum.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.common.cloud.newbee.enums; /** * @author 13 * @qq交流群 796794009 * @email 2449207463@qq.com * @link https://github.com/newbee-ltd * @apiNote 订单状态:0.待支付 1.已支付 2.配货完成 3:出库成功 4.交易成功 -1.手动关闭 -2.超时关闭 -3.商家关闭 */ public enum NewBeeMallOrderStatusEnum { DEFAULT(-9, "ERROR"), ORDER_PRE_PAY(0, "待支付"), ORDER_PAID(1, "已支付"), ORDER_PACKAGED(2, "配货完成"), ORDER_EXPRESS(3, "出库成功"), ORDER_SUCCESS(4, "交易成功"), ORDER_CLOSED_BY_MALLUSER(-1, "手动关闭"), ORDER_CLOSED_BY_EXPIRED(-2, "超时关闭"), ORDER_CLOSED_BY_JUDGE(-3, "商家关闭"); private int orderStatus; private String name; NewBeeMallOrderStatusEnum(int orderStatus, String name) { this.orderStatus = orderStatus; this.name = name; } public static NewBeeMallOrderStatusEnum getNewBeeMallOrderStatusEnumByStatus(int orderStatus) { for (NewBeeMallOrderStatusEnum newBeeMallOrderStatusEnum : NewBeeMallOrderStatusEnum.values()) { if (newBeeMallOrderStatusEnum.getOrderStatus() == orderStatus) { return newBeeMallOrderStatusEnum; } } return DEFAULT; } public int getOrderStatus() { return orderStatus; } public void setOrderStatus(int orderStatus) { this.orderStatus = orderStatus; } public String getName() { return name; } public void setName(String name) { this.name = name; } } ================================================ FILE: newbee-mall-cloud-common/src/main/java/ltd/common/cloud/newbee/enums/PayStatusEnum.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.common.cloud.newbee.enums; /** * @author 13 * @qq交流群 796794009 * @email 2449207463@qq.com * @link https://github.com/newbee-ltd * @apiNote 订单状态:0.支付中 1.支付成功 -1.支付失败 */ public enum PayStatusEnum { DEFAULT(-1, "支付失败"), PAY_ING(0, "支付中"), PAY_SUCCESS(1, "支付成功"); private int payStatus; private String name; PayStatusEnum(int payStatus, String name) { this.payStatus = payStatus; this.name = name; } public static PayStatusEnum getPayStatusEnumByStatus(int payStatus) { for (PayStatusEnum payStatusEnum : PayStatusEnum.values()) { if (payStatusEnum.getPayStatus() == payStatus) { return payStatusEnum; } } return DEFAULT; } public int getPayStatus() { return payStatus; } public void setPayStatus(int payStatus) { this.payStatus = payStatus; } public String getName() { return name; } public void setName(String name) { this.name = name; } } ================================================ FILE: newbee-mall-cloud-common/src/main/java/ltd/common/cloud/newbee/enums/PayTypeEnum.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.common.cloud.newbee.enums; /** * @author 13 * @qq交流群 796794009 * @email 2449207463@qq.com * @link https://github.com/newbee-ltd * @apiNote 订单状态:0.无 1.支付宝 2.微信支付 */ public enum PayTypeEnum { DEFAULT(-1, "ERROR"), NOT_PAY(0, "无"), ALI_PAY(1, "支付宝"), WEIXIN_PAY(2, "微信支付"); private int payType; private String name; PayTypeEnum(int payType, String name) { this.payType = payType; this.name = name; } public static PayTypeEnum getPayTypeEnumByType(int payType) { for (PayTypeEnum payTypeEnum : PayTypeEnum.values()) { if (payTypeEnum.getPayType() == payType) { return payTypeEnum; } } return DEFAULT; } public int getPayType() { return payType; } public void setPayType(int payType) { this.payType = payType; } public String getName() { return name; } public void setName(String name) { this.name = name; } } ================================================ FILE: newbee-mall-cloud-common/src/main/java/ltd/common/cloud/newbee/enums/ServiceResultEnum.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.common.cloud.newbee.enums; public enum ServiceResultEnum { ERROR("error"), SUCCESS("success"), DATA_NOT_EXIST("未查询到记录!"), PARAM_ERROR("参数错误!"), SAME_CATEGORY_EXIST("已存在同级同名的分类!"), SAME_LOGIN_NAME_EXIST("用户名已存在!"), LOGIN_NAME_NULL("请输入登录名!"), LOGIN_NAME_IS_NOT_PHONE("请输入正确的手机号!"), LOGIN_PASSWORD_NULL("请输入密码!"), LOGIN_VERIFY_CODE_NULL("请输入验证码!"), LOGIN_VERIFY_CODE_ERROR("验证码错误!"), SAME_INDEX_CONFIG_EXIST("已存在相同的首页配置项!"), GOODS_CATEGORY_ERROR("分类数据异常!"), SAME_GOODS_EXIST("已存在相同的商品信息!"), GOODS_NOT_EXIST("商品不存在!"), GOODS_PUT_DOWN("商品已下架!"), SHOPPING_CART_ITEM_LIMIT_NUMBER_ERROR("超出单个商品的最大购买数量!"), SHOPPING_CART_ITEM_NUMBER_ERROR("商品数量不能小于 1 !"), SHOPPING_CART_ITEM_TOTAL_NUMBER_ERROR("超出购物车最大容量!"), SHOPPING_CART_ITEM_EXIST_ERROR("已存在!无需重复添加!"), LOGIN_ERROR("登录失败!"), NOT_LOGIN_ERROR("未登录!"), ADMIN_NOT_LOGIN_ERROR("管理员未登录!"), TOKEN_EXPIRE_ERROR("无效认证!请重新登录!"), ADMIN_TOKEN_EXPIRE_ERROR("管理员登录过期!请重新登录!"), USER_NULL_ERROR("无效用户!请重新登录!"), LOGIN_USER_LOCKED_ERROR("用户已被禁止登录!"), ORDER_NOT_EXIST_ERROR("订单不存在!"), ORDER_ITEM_NOT_EXIST_ERROR("订单项不存在!"), NULL_ADDRESS_ERROR("地址不能为空!"), ORDER_PRICE_ERROR("订单价格异常!"), ORDER_ITEM_NULL_ERROR("订单项异常!"), ORDER_GENERATE_ERROR("生成订单异常!"), SHOPPING_ITEM_ERROR("购物车数据异常!"), SHOPPING_ITEM_COUNT_ERROR("库存不足!"), ORDER_STATUS_ERROR("订单状态异常!"), OPERATE_ERROR("操作失败!"), REQUEST_FORBIDEN_ERROR("禁止该操作!"), NO_PERMISSION_ERROR("无权限!"), DB_ERROR("database error"); private String result; ServiceResultEnum(String result) { this.result = result; } public String getResult() { return result; } public void setResult(String result) { this.result = result; } } ================================================ FILE: newbee-mall-cloud-common/src/main/java/ltd/common/cloud/newbee/exception/NewBeeMallException.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.common.cloud.newbee.exception; public class NewBeeMallException extends RuntimeException { public NewBeeMallException() { } public NewBeeMallException(String message) { super(message); } /** * 丢出一个异常 * * @param message */ public static void fail(String message) { throw new NewBeeMallException(message); } } ================================================ FILE: newbee-mall-cloud-common/src/main/java/ltd/common/cloud/newbee/pojo/AdminUserToken.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.common.cloud.newbee.pojo; import lombok.Data; import java.io.Serializable; @Data public class AdminUserToken implements Serializable { private Long adminUserId; private String token; } ================================================ FILE: newbee-mall-cloud-common/src/main/java/ltd/common/cloud/newbee/pojo/MallUserToken.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.common.cloud.newbee.pojo; import lombok.Data; import java.io.Serializable; @Data public class MallUserToken implements Serializable { private Long userId; private String token; } ================================================ FILE: newbee-mall-cloud-common/src/main/java/ltd/common/cloud/newbee/util/BeanUtil.java ================================================ package ltd.common.cloud.newbee.util; import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanWrapper; import org.springframework.beans.BeanWrapperImpl; import org.springframework.beans.PropertyAccessorFactory; import java.beans.PropertyDescriptor; import java.lang.reflect.Field; import java.util.*; public abstract class BeanUtil { public static Object copyProperties(Object source, Object target, String... ignoreProperties) { if (source == null) { return target; } BeanUtils.copyProperties(source, target, ignoreProperties); return target; } public static List copyList(List sources, Class clazz) { return copyList(sources, clazz, null); } public static List copyList(List sources, Class clazz, Callback callback) { List targetList = new ArrayList<>(); if (sources != null) { try { for (Object source : sources) { T target = clazz.newInstance(); copyProperties(source, target); if (callback != null) { callback.set(source, target); } targetList.add(target); } } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } return targetList; } public static Map toMap(Object bean, String... ignoreProperties) { Map map = new LinkedHashMap<>(); List ignoreList = new ArrayList<>(Arrays.asList(ignoreProperties)); ignoreList.add("class"); BeanWrapper beanWrapper = PropertyAccessorFactory.forBeanPropertyAccess(bean); for (PropertyDescriptor pd : beanWrapper.getPropertyDescriptors()) { if (!ignoreList.contains(pd.getName()) && beanWrapper.isReadableProperty(pd.getName())) { Object propertyValue = beanWrapper.getPropertyValue(pd.getName()); map.put(pd.getName(), propertyValue); } } return map; } public static T toBean(Map map, Class beanType) { BeanWrapper beanWrapper = new BeanWrapperImpl(beanType); map.forEach((key, value) -> { if (beanWrapper.isWritableProperty(key)) { beanWrapper.setPropertyValue(key, value); } }); return (T) beanWrapper.getWrappedInstance(); } public static interface Callback { void set(Object source, T target); } //检查Pojo对象是否有null字段 public static boolean checkPojoNullField(Object o, Class clz) { try { Field[] fields = clz.getDeclaredFields(); for (Field field : fields) { field.setAccessible(true); if (field.get(o) == null) { return false; } } if (clz.getSuperclass() != Object.class) { return checkPojoNullField(o, clz.getSuperclass()); } return true; } catch (IllegalAccessException e) { return false; } } } ================================================ FILE: newbee-mall-cloud-common/src/main/java/ltd/common/cloud/newbee/util/MD5Util.java ================================================ package ltd.common.cloud.newbee.util; import java.security.MessageDigest; /** * @author 13 * @qq交流群 796794009 * @email 2449207463@qq.com * @link https://github.com/newbee-ltd */ public class MD5Util { private static String byteArrayToHexString(byte b[]) { StringBuffer resultSb = new StringBuffer(); for (int i = 0; i < b.length; i++) resultSb.append(byteToHexString(b[i])); return resultSb.toString(); } private static String byteToHexString(byte b) { int n = b; if (n < 0) n += 256; int d1 = n / 16; int d2 = n % 16; return hexDigits[d1] + hexDigits[d2]; } public static String MD5Encode(String origin, String charsetname) { String resultString = null; try { resultString = new String(origin); MessageDigest md = MessageDigest.getInstance("MD5"); if (charsetname == null || "".equals(charsetname)) resultString = byteArrayToHexString(md.digest(resultString .getBytes())); else resultString = byteArrayToHexString(md.digest(resultString .getBytes(charsetname))); } catch (Exception exception) { } return resultString; } private static final String hexDigits[] = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"}; } ================================================ FILE: newbee-mall-cloud-common/src/main/java/ltd/common/cloud/newbee/util/NewBeeMallUtils.java ================================================ package ltd.common.cloud.newbee.util; import org.springframework.util.StringUtils; import java.net.URI; /** * @author 13 */ public class NewBeeMallUtils { public static URI getHost(URI uri) { URI effectiveURI = null; try { effectiveURI = new URI(uri.getScheme(), uri.getUserInfo(), uri.getHost(), uri.getPort(), null, null, null); } catch (Throwable var4) { effectiveURI = null; } return effectiveURI; } public static String cleanString(String value) { if (!StringUtils.hasText(value)) { return ""; } value = value.toLowerCase(); value = value.replaceAll("<", "& lt;").replaceAll(">", "& gt;"); value = value.replaceAll("\\(", "& #40;").replaceAll("\\)", "& #41;"); value = value.replaceAll("'", "& #39;"); value = value.replaceAll("onload", "0nl0ad"); value = value.replaceAll("xml", "xm1"); value = value.replaceAll("window", "wind0w"); value = value.replaceAll("click", "cl1ck"); value = value.replaceAll("var", "v0r"); value = value.replaceAll("let", "1et"); value = value.replaceAll("function", "functi0n"); value = value.replaceAll("return", "retu1n"); value = value.replaceAll("$", ""); value = value.replaceAll("document", "d0cument"); value = value.replaceAll("const", "c0nst"); value = value.replaceAll("eval\\((.*)\\)", ""); value = value.replaceAll("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']", "\"\""); value = value.replaceAll("script", "scr1pt"); value = value.replaceAll("insert", "1nsert"); value = value.replaceAll("drop", "dr0p"); value = value.replaceAll("create", "cre0ate"); value = value.replaceAll("update", "upd0ate"); value = value.replaceAll("alter", "a1ter"); value = value.replaceAll("from", "fr0m"); value = value.replaceAll("where", "wh1re"); value = value.replaceAll("database", "data1base"); value = value.replaceAll("table", "tab1e"); value = value.replaceAll("tb", "tb0"); return value; } } ================================================ FILE: newbee-mall-cloud-common/src/main/java/ltd/common/cloud/newbee/util/NumberUtil.java ================================================ package ltd.common.cloud.newbee.util; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @author 13 * @qq交流群 796794009 * @email 2449207463@qq.com * @link https://github.com/newbee-ltd */ public class NumberUtil { private NumberUtil() { } /** * 判断是否为11位电话号码 * * @param phone * @return */ public static boolean isPhone(String phone) { Pattern pattern = Pattern.compile("^((13[0-9])|(14[5,7])|(15[^4,\\D])|(17[0-8])|(18[0-9]))\\d{8}$"); Matcher matcher = pattern.matcher(phone); return matcher.matches(); } /** * 生成指定长度的随机数 * * @param length * @return */ public static int genRandomNum(int length) { int num = 1; double random = Math.random(); if (random < 0.1) { random = random + 0.1; } for (int i = 0; i < length; i++) { num = num * 10; } return (int) ((random * num)); } /** * 生成订单流水号 * * @return */ public static String genOrderNo() { StringBuffer buffer = new StringBuffer(String.valueOf(System.currentTimeMillis())); int num = genRandomNum(4); buffer.append(num); return buffer.toString(); } } ================================================ FILE: newbee-mall-cloud-common/src/main/java/ltd/common/cloud/newbee/util/SystemUtil.java ================================================ package ltd.common.cloud.newbee.util; import java.math.BigInteger; import java.security.MessageDigest; /** * @author 13 * @qq交流群 796794009 * @email 2449207463@qq.com * @link https://github.com/newbee-ltd */ public class SystemUtil { private SystemUtil() { } /** * 登录或注册成功后,生成保持用户登录状态会话token值 * * @param src:为用户最新一次登录时的now()+user.id+random(4) * @return */ public static String genToken(String src) { if (null == src || "".equals(src)) { return null; } try { MessageDigest md = MessageDigest.getInstance("MD5"); md.update(src.getBytes()); String result = new BigInteger(1, md.digest()).toString(16); if (result.length() == 31) { result = result + "-"; } System.out.println(result); return result; } catch (Exception e) { return null; } } } ================================================ FILE: newbee-mall-cloud-gateway-admin/pom.xml ================================================ 4.0.0 ltd.newbee.cloud newbee-mall-cloud-gateway-admin 0.0.1-SNAPSHOT newbee-mall-cloud-gateway-admin 网关模块 ltd.newbee.cloud newbee-mall-cloud 0.0.1-SNAPSHOT 1.8 org.springframework.cloud spring-cloud-starter-gateway org.springframework.cloud spring-cloud-starter-loadbalancer com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery io.springfox springfox-boot-starter org.springframework.boot spring-boot-starter-data-redis ltd.user.newbee.cloud newbee-mall-cloud-user-api 0.0.1-SNAPSHOT ltd.newbee.cloud newbee-mall-cloud-common 0.0.1-SNAPSHOT ================================================ FILE: newbee-mall-cloud-gateway-admin/src/main/java/ltd/gateway/cloud/newbee/NewBeeMallCloudAdminGatewayApplication.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本系统已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.gateway.cloud.newbee; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; /** * @author 程序员十三 * @qq交流群 791509631 * @email 2449207463@qq.com * @link https://github.com/newbee-ltd */ @SpringBootApplication @EnableDiscoveryClient public class NewBeeMallCloudAdminGatewayApplication { public static void main(String[] args) { SpringApplication.run(NewBeeMallCloudAdminGatewayApplication.class, args); } } ================================================ FILE: newbee-mall-cloud-gateway-admin/src/main/java/ltd/gateway/cloud/newbee/config/PolymerizeSwaggerProvider.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本系统已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.gateway.cloud.newbee.config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.gateway.config.GatewayProperties; import org.springframework.cloud.gateway.support.NameUtils; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Component; import springfox.documentation.swagger.web.SwaggerResource; import springfox.documentation.swagger.web.SwaggerResourcesProvider; import java.util.ArrayList; import java.util.List; /** * 在网关层聚合底层微服务的Swagger资源 * * @author 程序员十三 * @qq交流群 791509631 * @email 2449207463@qq.com * @link https://github.com/newbee-ltd */ @Primary @Component public class PolymerizeSwaggerProvider implements SwaggerResourcesProvider { /** * Swagger Doc的URL后缀 */ public static final String API_DOCS_URL = "/v3/api-docs"; @Autowired private GatewayProperties gatewayProperties; @Override public List get() { List resources = new ArrayList<>(); List routes = new ArrayList<>(); //需要聚合的路由配置 routes.add("user-service-swagger-route"); routes.add("goods-service-swagger-route"); routes.add("recommend-service-swagger-route"); routes.add("order-service-swagger-route"); gatewayProperties.getRoutes().stream().filter(routeDefinition -> routes.contains(routeDefinition.getId())) .forEach(routeDefinition -> routeDefinition.getPredicates().stream() .filter(predicateDefinition -> ("Path").equalsIgnoreCase(predicateDefinition.getName())) .forEach(predicateDefinition -> resources.add(swaggerResource(routeDefinition.getId(), predicateDefinition.getArgs().get(NameUtils.GENERATED_NAME_PREFIX + "0") .replace("/**", API_DOCS_URL))))); return resources; } private SwaggerResource swaggerResource(String name, String url) { SwaggerResource swaggerResource = new SwaggerResource(); swaggerResource.setName(name); swaggerResource.setLocation(url); swaggerResource.setSwaggerVersion("3.0"); return swaggerResource; } } ================================================ FILE: newbee-mall-cloud-gateway-admin/src/main/java/ltd/gateway/cloud/newbee/config/RedisConfig.java ================================================ package ltd.gateway.cloud.newbee.config; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.CachingConfigurerSupport; import org.springframework.cache.annotation.EnableCaching; import org.springframework.cache.interceptor.KeyGenerator; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.cache.RedisCacheManager; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; import javax.annotation.Resource; import java.io.Serializable; import java.lang.reflect.Method; import java.util.HashSet; import java.util.Set; @Configuration @EnableCaching @AutoConfigureAfter(RedisAutoConfiguration.class) public class RedisConfig extends CachingConfigurerSupport { @Resource private LettuceConnectionFactory lettuceConnectionFactory; public RedisConfig(){} @Bean public RedisTemplate redisCacheTemplate(LettuceConnectionFactory redisConnectionFactory){ RedisTemplate template = new RedisTemplate(); template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); template.setHashKeySerializer(new StringRedisSerializer()); template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); template.setConnectionFactory(redisConnectionFactory); return template; } @Bean public CacheManager cacheManager() { RedisCacheManager.RedisCacheManagerBuilder builder = RedisCacheManager.RedisCacheManagerBuilder .fromConnectionFactory(lettuceConnectionFactory); @SuppressWarnings("serial") Set cacheNames = new HashSet() { { add("codeNameCache"); } }; builder.initialCacheNames(cacheNames); return builder.build(); } @Bean public KeyGenerator keyGenerator() { return new KeyGenerator() { @Override public Object generate(Object target, Method method, Object... params) { StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append(target.getClass().getName()); stringBuffer.append(method.getName()); for (Object obj : params) { stringBuffer.append(obj.toString()); } return stringBuffer.toString(); } }; } } ================================================ FILE: newbee-mall-cloud-gateway-admin/src/main/java/ltd/gateway/cloud/newbee/filter/ValidTokenGlobalFilter.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本系统已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.gateway.cloud.newbee.filter; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import ltd.common.cloud.newbee.dto.Result; import ltd.common.cloud.newbee.dto.ResultGenerator; import ltd.common.cloud.newbee.pojo.AdminUserToken; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.core.Ordered; import org.springframework.core.io.buffer.DataBuffer; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ValueOperations; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import java.nio.charset.StandardCharsets; /** * @author 程序员十三 * @qq交流群 791509631 * @email 2449207463@qq.com * @link https://github.com/newbee-ltd */ @Component public class ValidTokenGlobalFilter implements GlobalFilter, Ordered { @Autowired private RedisTemplate redisTemplate; @Override public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { // 登录接口、swagger请求,直接放行 if (exchange.getRequest().getURI().getPath().equals("/users/admin/login") || exchange.getRequest().getURI().getPath().contains("/swagger/v3/api-docs")) { return chain.filter(exchange); } HttpHeaders headers = exchange.getRequest().getHeaders(); if (headers == null || headers.isEmpty()) { // 返回错误提示 return wrapErrorResponse(exchange, chain); } String token = headers.getFirst("token"); if (!StringUtils.hasText(token)) { // 返回错误提示 return wrapErrorResponse(exchange, chain); } ValueOperations opsForAdminUserToken = redisTemplate.opsForValue(); AdminUserToken tokenObject = opsForAdminUserToken.get(token); if (tokenObject == null) { // 返回错误提示 return wrapErrorResponse(exchange, chain); } return chain.filter(exchange); } @Override public int getOrder() { return Ordered.HIGHEST_PRECEDENCE; } Mono wrapErrorResponse(ServerWebExchange exchange, GatewayFilterChain chain) { Result result = ResultGenerator.genErrorResult(419, "无权限访问"); ObjectMapper mapper = new ObjectMapper(); ObjectNode resultNode = mapper.valueToTree(result); byte[] bytes = resultNode.toString().getBytes(StandardCharsets.UTF_8); DataBuffer dataBuffer = exchange.getResponse().bufferFactory().wrap(bytes); exchange.getResponse().setStatusCode(HttpStatus.OK); return exchange.getResponse().writeWith(Flux.just(dataBuffer)); } } ================================================ FILE: newbee-mall-cloud-gateway-admin/src/main/resources/application.properties ================================================ server.port=29100 # 服务名称 spring.application.name=newbee-mall-cloud-gateway-admin # Nacos地址 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 # Nacos登录用户名(默认为nacos,生产环境一定要修改) spring.cloud.nacos.username=nacos # Nacos登录密码(默认为nacos,生产环境一定要修改) spring.cloud.nacos.password=nacos # 网关开启服务注册与服务发现 spring.cloud.gateway.discovery.locator.enabled=true spring.cloud.gateway.discovery.locator.lower-case-service-id=true # 用户服务的路由配置 spring.cloud.gateway.routes[0].id=user-service-route spring.cloud.gateway.routes[0].uri=lb://newbee-mall-cloud-user-service spring.cloud.gateway.routes[0].order=1 spring.cloud.gateway.routes[0].predicates[0]=Path=/users/admin/** # 商品服务的路由配置-1 spring.cloud.gateway.routes[1].id=categories-admin-service-route spring.cloud.gateway.routes[1].uri=lb://newbee-mall-cloud-goods-service spring.cloud.gateway.routes[1].order=1 spring.cloud.gateway.routes[1].predicates[0]=Path=/categories/admin/** # 商品服务的路由配置-2 spring.cloud.gateway.routes[2].id=goods-admin-service-route spring.cloud.gateway.routes[2].uri=lb://newbee-mall-cloud-goods-service spring.cloud.gateway.routes[2].order=1 spring.cloud.gateway.routes[2].predicates[0]=Path=/goods/admin/** # 推荐服务的路由配置-1 spring.cloud.gateway.routes[3].id=carousels-admin-service-route spring.cloud.gateway.routes[3].uri=lb://newbee-mall-cloud-recommend-service spring.cloud.gateway.routes[3].order=1 spring.cloud.gateway.routes[3].predicates[0]=Path=/carousels/admin/** # 推荐服务的路由配置-2 spring.cloud.gateway.routes[4].id=indexConfigs-admin-service-route spring.cloud.gateway.routes[4].uri=lb://newbee-mall-cloud-recommend-service spring.cloud.gateway.routes[4].order=1 spring.cloud.gateway.routes[4].predicates[0]=Path=/indexConfigs/admin/** # 订单服务的路由配置 spring.cloud.gateway.routes[5].id=order-service-route spring.cloud.gateway.routes[5].uri=lb://newbee-mall-cloud-order-service spring.cloud.gateway.routes[5].order=1 spring.cloud.gateway.routes[5].predicates[0]=Path=/orders/admin/** # 用户服务Swagger的路由配置 spring.cloud.gateway.routes[6].id=user-service-swagger-route spring.cloud.gateway.routes[6].uri=lb://newbee-mall-cloud-user-service spring.cloud.gateway.routes[6].order=1 spring.cloud.gateway.routes[6].predicates[0]=Path=/users/swagger/** spring.cloud.gateway.routes[6].filters[0]=StripPrefix=2 # 商品服务Swagger的路由配置 spring.cloud.gateway.routes[7].id=goods-service-swagger-route spring.cloud.gateway.routes[7].uri=lb://newbee-mall-cloud-goods-service spring.cloud.gateway.routes[7].order=1 spring.cloud.gateway.routes[7].predicates[0]=Path=/categories/swagger/** spring.cloud.gateway.routes[7].filters[0]=StripPrefix=2 # 推荐服务Swagger的路由配置 spring.cloud.gateway.routes[8].id=recommend-service-swagger-route spring.cloud.gateway.routes[8].uri=lb://newbee-mall-cloud-recommend-service spring.cloud.gateway.routes[8].order=1 spring.cloud.gateway.routes[8].predicates[0]=Path=/indexConfigs/swagger/** spring.cloud.gateway.routes[8].filters[0]=StripPrefix=2 # 订单服务Swagger的路由配置 spring.cloud.gateway.routes[9].id=order-service-swagger-route spring.cloud.gateway.routes[9].uri=lb://newbee-mall-cloud-order-service spring.cloud.gateway.routes[9].order=1 spring.cloud.gateway.routes[9].predicates[0]=Path=/orders/swagger/** spring.cloud.gateway.routes[9].filters[0]=StripPrefix=2 ##Redis 配置 # Redis数据库索引(默认为0) spring.redis.database=13 # Redis服务器地址 spring.redis.host=127.0.0.1 # Redis服务器连接端口 spring.redis.port=6379 # Redis服务器连接密码 spring.redis.password=123456789 # 连接池最大连接数(使用负值表示没有限制) spring.redis.jedis.pool.max-active=8 # 连接池最大阻塞等待时间(使用负值表示没有限制) spring.redis.jedis.pool.max-wait=-1 # 连接池中的最大空闲连接 spring.redis.jedis.pool.max-idle=8 # 连接池中的最小空闲连接 spring.redis.jedis.pool.min-idle=0 # 连接超时时间(毫秒) spring.redis.timeout=5000 ================================================ FILE: newbee-mall-cloud-gateway-mall/pom.xml ================================================ 4.0.0 ltd.newbee.cloud newbee-mall-cloud-gateway-mall 0.0.1-SNAPSHOT newbee-mall-cloud-gateway-mall 商城端网关模块 ltd.newbee.cloud newbee-mall-cloud 0.0.1-SNAPSHOT 1.8 UTF-8 UTF-8 org.springframework.cloud spring-cloud-starter-gateway org.springframework.cloud spring-cloud-starter-loadbalancer com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery org.springframework.boot spring-boot-starter-data-redis io.springfox springfox-boot-starter ltd.user.newbee.cloud newbee-mall-cloud-user-api 0.0.1-SNAPSHOT ltd.newbee.cloud newbee-mall-cloud-common 0.0.1-SNAPSHOT ================================================ FILE: newbee-mall-cloud-gateway-mall/src/main/java/ltd/gateway/cloud/newbee/NewBeeMallCloudMallGatewayApplication.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本系统已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.gateway.cloud.newbee; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; /** * @author 程序员十三 * @qq交流群 791509631 * @email 2449207463@qq.com * @link https://github.com/newbee-ltd */ @SpringBootApplication @EnableDiscoveryClient public class NewBeeMallCloudMallGatewayApplication { public static void main(String[] args) { SpringApplication.run(NewBeeMallCloudMallGatewayApplication.class, args); } } ================================================ FILE: newbee-mall-cloud-gateway-mall/src/main/java/ltd/gateway/cloud/newbee/config/PolymerizeSwaggerProvider.java ================================================ package ltd.gateway.cloud.newbee.config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.gateway.config.GatewayProperties; import org.springframework.cloud.gateway.support.NameUtils; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Component; import springfox.documentation.swagger.web.SwaggerResource; import springfox.documentation.swagger.web.SwaggerResourcesProvider; import java.util.ArrayList; import java.util.List; /** * 在网关层聚合底层微服务的Swagger资源 * * @author 程序员十三 * @qq交流群 791509631 * @email 2449207463@qq.com * @link https://github.com/newbee-ltd */ @Primary @Component public class PolymerizeSwaggerProvider implements SwaggerResourcesProvider { /** * Swagger Doc的URL后缀 */ public static final String API_DOCS_URL = "/v3/api-docs"; @Autowired private GatewayProperties gatewayProperties; @Override public List get() { List resources = new ArrayList<>(); List routes = new ArrayList<>(); //需要聚合的路由配置 routes.add("user-service-swagger-route"); routes.add("recommend-service-swagger-route"); routes.add("goods-service-swagger-route"); routes.add("order-service-swagger-route"); routes.add("shop-cart-service-swagger-route"); gatewayProperties.getRoutes().stream().filter(routeDefinition -> routes.contains(routeDefinition.getId())) .forEach(routeDefinition -> routeDefinition.getPredicates().stream() .filter(predicateDefinition -> ("Path").equalsIgnoreCase(predicateDefinition.getName())) .forEach(predicateDefinition -> resources.add(swaggerResource(routeDefinition.getId(), predicateDefinition.getArgs().get(NameUtils.GENERATED_NAME_PREFIX + "0") .replace("/**", API_DOCS_URL))))); return resources; } private SwaggerResource swaggerResource(String name, String url) { SwaggerResource swaggerResource = new SwaggerResource(); swaggerResource.setName(name); swaggerResource.setLocation(url); swaggerResource.setSwaggerVersion("3.0"); return swaggerResource; } } ================================================ FILE: newbee-mall-cloud-gateway-mall/src/main/java/ltd/gateway/cloud/newbee/config/RedisConfig.java ================================================ package ltd.gateway.cloud.newbee.config; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.CachingConfigurerSupport; import org.springframework.cache.annotation.EnableCaching; import org.springframework.cache.interceptor.KeyGenerator; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.cache.RedisCacheManager; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; import javax.annotation.Resource; import java.io.Serializable; import java.lang.reflect.Method; import java.util.HashSet; import java.util.Set; @Configuration @EnableCaching @AutoConfigureAfter(RedisAutoConfiguration.class) public class RedisConfig extends CachingConfigurerSupport { @Resource private LettuceConnectionFactory lettuceConnectionFactory; public RedisConfig(){} @Bean public RedisTemplate redisCacheTemplate(LettuceConnectionFactory redisConnectionFactory){ RedisTemplate template = new RedisTemplate(); template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); template.setHashKeySerializer(new StringRedisSerializer()); template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); template.setConnectionFactory(redisConnectionFactory); return template; } @Bean public CacheManager cacheManager() { RedisCacheManager.RedisCacheManagerBuilder builder = RedisCacheManager.RedisCacheManagerBuilder .fromConnectionFactory(lettuceConnectionFactory); @SuppressWarnings("serial") Set cacheNames = new HashSet() { { add("codeNameCache"); } }; builder.initialCacheNames(cacheNames); return builder.build(); } @Bean public KeyGenerator keyGenerator() { return new KeyGenerator() { @Override public Object generate(Object target, Method method, Object... params) { StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append(target.getClass().getName()); stringBuffer.append(method.getName()); for (Object obj : params) { stringBuffer.append(obj.toString()); } return stringBuffer.toString(); } }; } } ================================================ FILE: newbee-mall-cloud-gateway-mall/src/main/java/ltd/gateway/cloud/newbee/filter/ValidMallUserTokenGlobalFilter.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本系统已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.gateway.cloud.newbee.filter; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import ltd.common.cloud.newbee.dto.Result; import ltd.common.cloud.newbee.dto.ResultGenerator; import ltd.common.cloud.newbee.pojo.MallUserToken; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.core.Ordered; import org.springframework.core.io.buffer.DataBuffer; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ValueOperations; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; /** * @author 程序员十三 * @qq交流群 791509631 * @email 2449207463@qq.com * @link https://github.com/newbee-ltd */ @Component public class ValidMallUserTokenGlobalFilter implements GlobalFilter, Ordered { @Autowired private RedisTemplate redisTemplate; @Override public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { final List ignoreURLs = new ArrayList<>(); ignoreURLs.add("/users/mall/login"); ignoreURLs.add("/users/mall/register"); ignoreURLs.add("/categories/mall/listAll"); ignoreURLs.add("/mall/index/recommondInfos"); ignoreURLs.add("/indexConfigs/swagger/v3/api-docs"); ignoreURLs.add("/carts/swagger/v3/api-docs"); ignoreURLs.add("/orders/swagger/v3/api-docs"); ignoreURLs.add("/users/swagger/v3/api-docs"); ignoreURLs.add("/goods/swagger/v3/api-docs"); // 登录注册接口,直接放行 if (ignoreURLs.contains(exchange.getRequest().getURI().getPath())) { return chain.filter(exchange); } HttpHeaders headers = exchange.getRequest().getHeaders(); if (headers == null || headers.isEmpty()) { // 返回错误提示 return wrapErrorResponse(exchange, chain); } String token = headers.getFirst("token"); if (!StringUtils.hasText(token)) { // 返回错误提示 return wrapErrorResponse(exchange, chain); } ValueOperations opsForMallUserToken = redisTemplate.opsForValue(); MallUserToken tokenObject = opsForMallUserToken.get(token); if (tokenObject == null) { // 返回错误提示 return wrapErrorResponse(exchange, chain); } return chain.filter(exchange); } @Override public int getOrder() { return Ordered.HIGHEST_PRECEDENCE; } Mono wrapErrorResponse(ServerWebExchange exchange, GatewayFilterChain chain) { Result result = ResultGenerator.genErrorResult(416, "无权限访问"); ObjectMapper mapper = new ObjectMapper(); ObjectNode resultNode = mapper.valueToTree(result); byte[] bytes = resultNode.toString().getBytes(StandardCharsets.UTF_8); DataBuffer dataBuffer = exchange.getResponse().bufferFactory().wrap(bytes); exchange.getResponse().setStatusCode(HttpStatus.OK); return exchange.getResponse().writeWith(Flux.just(dataBuffer)); } } ================================================ FILE: newbee-mall-cloud-gateway-mall/src/main/resources/application.properties ================================================ server.port=29110 # 服务名称 spring.application.name=newbee-mall-cloud-gateway-mall # Nacos地址 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 # Nacos登录用户名(默认为nacos,生产环境一定要修改) spring.cloud.nacos.username=nacos # Nacos登录密码(默认为nacos,生产环境一定要修改) spring.cloud.nacos.password=nacos # 网关开启服务注册与服务发现 spring.cloud.gateway.discovery.locator.enabled=true spring.cloud.gateway.discovery.locator.lower-case-service-id=true # 用户服务的路由配置 spring.cloud.gateway.routes[0].id=user-service-route spring.cloud.gateway.routes[0].uri=lb://newbee-mall-cloud-user-service spring.cloud.gateway.routes[0].order=1 spring.cloud.gateway.routes[0].predicates[0]=Path=/users/mall/** # 首页接口的路由配置 spring.cloud.gateway.routes[1].id=recommend-service-route spring.cloud.gateway.routes[1].uri=lb://newbee-mall-cloud-recommend-service spring.cloud.gateway.routes[1].order=1 spring.cloud.gateway.routes[1].predicates[0]=Path=/mall/index/** # 分类接口的路由配置 spring.cloud.gateway.routes[2].id=goods-service-route spring.cloud.gateway.routes[2].uri=lb://newbee-mall-cloud-goods-service spring.cloud.gateway.routes[2].order=1 spring.cloud.gateway.routes[2].predicates[0]=Path=/categories/mall/** # 商品接口的路由配置 spring.cloud.gateway.routes[3].id=goods-service-route2 spring.cloud.gateway.routes[3].uri=lb://newbee-mall-cloud-goods-service spring.cloud.gateway.routes[3].order=1 spring.cloud.gateway.routes[3].predicates[0]=Path=/goods/mall/** # 购物车接口的路由配置 spring.cloud.gateway.routes[4].id=shop-cart-service-route spring.cloud.gateway.routes[4].uri=lb://newbee-mall-cloud-shop-cart-service spring.cloud.gateway.routes[4].order=1 spring.cloud.gateway.routes[4].predicates[0]=Path=/shop-cart/** # 订单接口的路由配置 spring.cloud.gateway.routes[5].id=order-service-route spring.cloud.gateway.routes[5].uri=lb://newbee-mall-cloud-order-service spring.cloud.gateway.routes[5].order=1 spring.cloud.gateway.routes[5].predicates[0]=Path=/orders/mall/** # 收货地址接口的路由配置 spring.cloud.gateway.routes[6].id=order-service-route2 spring.cloud.gateway.routes[6].uri=lb://newbee-mall-cloud-order-service spring.cloud.gateway.routes[6].order=1 spring.cloud.gateway.routes[6].predicates[0]=Path=/mall/address/** # 商品服务Swagger的路由配置 spring.cloud.gateway.routes[7].id=goods-service-swagger-route spring.cloud.gateway.routes[7].uri=lb://newbee-mall-cloud-goods-service spring.cloud.gateway.routes[7].order=1 spring.cloud.gateway.routes[7].predicates[0]=Path=/goods/swagger/** spring.cloud.gateway.routes[7].filters[0]=StripPrefix=2 # 推荐服务Swagger的路由配置 spring.cloud.gateway.routes[8].id=recommend-service-swagger-route spring.cloud.gateway.routes[8].uri=lb://newbee-mall-cloud-recommend-service spring.cloud.gateway.routes[8].order=1 spring.cloud.gateway.routes[8].predicates[0]=Path=/indexConfigs/swagger/** spring.cloud.gateway.routes[8].filters[0]=StripPrefix=2 # 订单服务Swagger的路由配置 spring.cloud.gateway.routes[9].id=order-service-swagger-route spring.cloud.gateway.routes[9].uri=lb://newbee-mall-cloud-order-service spring.cloud.gateway.routes[9].order=1 spring.cloud.gateway.routes[9].predicates[0]=Path=/orders/swagger/** spring.cloud.gateway.routes[9].filters[0]=StripPrefix=2 # 用户服务Swagger的路由配置 spring.cloud.gateway.routes[10].id=user-service-swagger-route spring.cloud.gateway.routes[10].uri=lb://newbee-mall-cloud-user-service spring.cloud.gateway.routes[10].order=1 spring.cloud.gateway.routes[10].predicates[0]=Path=/users/swagger/** spring.cloud.gateway.routes[10].filters[0]=StripPrefix=2 # 购物车服务Swagger的路由配置 spring.cloud.gateway.routes[11].id=shop-cart-service-swagger-route spring.cloud.gateway.routes[11].uri=lb://newbee-mall-cloud-shop-cart-service spring.cloud.gateway.routes[11].order=1 spring.cloud.gateway.routes[11].predicates[0]=Path=/carts/swagger/** spring.cloud.gateway.routes[11].filters[0]=StripPrefix=2 ##Redis 配置 # Redis数据库索引(默认为0) spring.redis.database=13 # Redis服务器地址 spring.redis.host=127.0.0.1 # Redis服务器连接端口 spring.redis.port=6379 # Redis服务器连接密码 spring.redis.password=123456789 # 连接池最大连接数(使用负值表示没有限制) spring.redis.jedis.pool.max-active=8 # 连接池最大阻塞等待时间(使用负值表示没有限制) spring.redis.jedis.pool.max-wait=-1 # 连接池中的最大空闲连接 spring.redis.jedis.pool.max-idle=8 # 连接池中的最小空闲连接 spring.redis.jedis.pool.min-idle=0 # 连接超时时间(毫秒) spring.redis.timeout=5000 ================================================ FILE: newbee-mall-cloud-goods-service/newbee-mall-cloud-goods-api/pom.xml ================================================ 4.0.0 ltd.goods.newbee.cloud newbee-mall-cloud-goods-api jar 0.0.1-SNAPSHOT newbee-mall-cloud-goods-api 商品服务openfeign ltd.newbee.cloud newbee-mall-cloud-goods-service 0.0.1-SNAPSHOT 1.8 org.springframework.cloud spring-cloud-starter-openfeign ltd.newbee.cloud newbee-mall-cloud-common 0.0.1-SNAPSHOT ================================================ FILE: newbee-mall-cloud-goods-service/newbee-mall-cloud-goods-api/src/main/java/ltd/goods/cloud/newbee/dto/NewBeeMallGoodsDTO.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.goods.cloud.newbee.dto; public class NewBeeMallGoodsDTO { private Long goodsId; private String goodsName; private String goodsIntro; private Long goodsCategoryId; private String goodsCoverImg; private String goodsCarousel; private Integer originalPrice; private Integer sellingPrice; private Integer stockNum; private String tag; private Byte goodsSellStatus; public Long getGoodsId() { return goodsId; } public void setGoodsId(Long goodsId) { this.goodsId = goodsId; } public String getGoodsName() { return goodsName; } public void setGoodsName(String goodsName) { this.goodsName = goodsName; } public String getGoodsIntro() { return goodsIntro; } public void setGoodsIntro(String goodsIntro) { this.goodsIntro = goodsIntro; } public Long getGoodsCategoryId() { return goodsCategoryId; } public void setGoodsCategoryId(Long goodsCategoryId) { this.goodsCategoryId = goodsCategoryId; } public String getGoodsCoverImg() { return goodsCoverImg; } public void setGoodsCoverImg(String goodsCoverImg) { this.goodsCoverImg = goodsCoverImg; } public String getGoodsCarousel() { return goodsCarousel; } public void setGoodsCarousel(String goodsCarousel) { this.goodsCarousel = goodsCarousel; } public Integer getOriginalPrice() { return originalPrice; } public void setOriginalPrice(Integer originalPrice) { this.originalPrice = originalPrice; } public Integer getSellingPrice() { return sellingPrice; } public void setSellingPrice(Integer sellingPrice) { this.sellingPrice = sellingPrice; } public Integer getStockNum() { return stockNum; } public void setStockNum(Integer stockNum) { this.stockNum = stockNum; } public String getTag() { return tag; } public void setTag(String tag) { this.tag = tag; } public Byte getGoodsSellStatus() { return goodsSellStatus; } public void setGoodsSellStatus(Byte goodsSellStatus) { this.goodsSellStatus = goodsSellStatus; } } ================================================ FILE: newbee-mall-cloud-goods-service/newbee-mall-cloud-goods-api/src/main/java/ltd/goods/cloud/newbee/dto/StockNumDTO.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.goods.cloud.newbee.dto; public class StockNumDTO { private Long goodsId; private Integer goodsCount; public Long getGoodsId() { return goodsId; } public void setGoodsId(Long goodsId) { this.goodsId = goodsId; } public Integer getGoodsCount() { return goodsCount; } public void setGoodsCount(Integer goodsCount) { this.goodsCount = goodsCount; } } ================================================ FILE: newbee-mall-cloud-goods-service/newbee-mall-cloud-goods-api/src/main/java/ltd/goods/cloud/newbee/dto/UpdateStockNumDTO.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.goods.cloud.newbee.dto; import java.util.List; public class UpdateStockNumDTO { private List stockNumDTOS; public List getStockNumDTOS() { return stockNumDTOS; } public void setStockNumDTOS(List stockNumDTOS) { this.stockNumDTOS = stockNumDTOS; } } ================================================ FILE: newbee-mall-cloud-goods-service/newbee-mall-cloud-goods-api/src/main/java/ltd/goods/cloud/newbee/openfeign/NewBeeCloudGoodsServiceFeign.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本系统已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.goods.cloud.newbee.openfeign; import ltd.common.cloud.newbee.dto.Result; import ltd.goods.cloud.newbee.dto.NewBeeMallGoodsDTO; import ltd.goods.cloud.newbee.dto.UpdateStockNumDTO; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import java.util.List; @FeignClient(value = "newbee-mall-cloud-goods-service", path = "/goods") public interface NewBeeCloudGoodsServiceFeign { @GetMapping(value = "/admin/goodsDetail") Result getGoodsDetail(@RequestParam(value = "goodsId") Long goodsId); @GetMapping(value = "/admin/listByGoodsIds") Result> listByGoodsIds(@RequestParam(value = "goodsIds") List goodsIds); @PutMapping(value = "/admin/updateStock") Result updateStock(@RequestBody UpdateStockNumDTO updateStockNumDTO); } ================================================ FILE: newbee-mall-cloud-goods-service/newbee-mall-cloud-goods-web/pom.xml ================================================ 4.0.0 ltd.goods.newbee.cloud newbee-mall-cloud-goods-web 0.0.1-SNAPSHOT newbee-mall-cloud-goods-web 商品服务 ltd.newbee.cloud newbee-mall-cloud-goods-service 0.0.1-SNAPSHOT 1.8 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-test test com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery org.springframework.boot spring-boot-starter-validation org.mybatis.spring.boot mybatis-spring-boot-starter com.alibaba.cloud spring-cloud-starter-alibaba-seata org.projectlombok lombok ${lombok.version} provided io.springfox springfox-boot-starter mysql mysql-connector-java runtime com.alibaba.cloud spring-cloud-starter-alibaba-sentinel org.springframework.cloud spring-cloud-starter-sleuth org.springframework.cloud spring-cloud-sleuth-zipkin net.logstash.logback logstash-logback-encoder ${logstash-logback-encoder.version} ltd.newbee.cloud newbee-mall-cloud-common 0.0.1-SNAPSHOT org.springframework.cloud spring-cloud-starter-loadbalancer ltd.user.newbee.cloud newbee-mall-cloud-user-api 0.0.1-SNAPSHOT ================================================ FILE: newbee-mall-cloud-goods-service/newbee-mall-cloud-goods-web/src/main/java/ltd/goods/cloud/newbee/NewBeeMallCloudGoodsServiceApplication.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本系统已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.goods.cloud.newbee; import ltd.user.cloud.newbee.openfeign.NewBeeCloudUserServiceFeign; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.openfeign.EnableFeignClients; /** * @author 程序员十三 * @qq交流群 791509631 * @email 2449207463@qq.com * @link https://github.com/newbee-ltd */ @SpringBootApplication @EnableDiscoveryClient @MapperScan("ltd.goods.cloud.newbee.dao") @EnableFeignClients(basePackageClasses = {NewBeeCloudUserServiceFeign.class}) public class NewBeeMallCloudGoodsServiceApplication { public static void main(String[] args) { System.setProperty("nacos.logging.default.config.enabled","false"); SpringApplication.run(NewBeeMallCloudGoodsServiceApplication.class, args); } } ================================================ FILE: newbee-mall-cloud-goods-service/newbee-mall-cloud-goods-web/src/main/java/ltd/goods/cloud/newbee/config/GoodsServiceExceptionHandler.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.goods.cloud.newbee.config; import ltd.common.cloud.newbee.enums.ServiceResultEnum; import ltd.common.cloud.newbee.dto.Result; import ltd.common.cloud.newbee.exception.NewBeeMallException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.validation.BindException; import org.springframework.validation.BindingResult; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import javax.servlet.http.HttpServletRequest; import java.util.Objects; /** * 全局异常处理 */ @RestControllerAdvice public class GoodsServiceExceptionHandler { private static final Logger log = LoggerFactory.getLogger(GoodsServiceExceptionHandler.class); @ExceptionHandler(BindException.class) public Object bindException(BindException e) { log.error("GoodsServiceExceptionHandler:",e); Result result = new Result(); result.setResultCode(510); BindingResult bindingResult = e.getBindingResult(); result.setMessage(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage()); return result; } @ExceptionHandler(MethodArgumentNotValidException.class) public Object bindException(MethodArgumentNotValidException e) { log.error("GoodsServiceExceptionHandler:",e); Result result = new Result(); result.setResultCode(510); BindingResult bindingResult = e.getBindingResult(); result.setMessage(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage()); return result; } @ExceptionHandler(Exception.class) public Object handleException(Exception e, HttpServletRequest req) { log.error("GoodsServiceExceptionHandler:",e); Result result = new Result(); result.setResultCode(500); //区分是否为自定义异常 if (e instanceof NewBeeMallException) { result.setMessage(e.getMessage()); if (e.getMessage().equals(ServiceResultEnum.ADMIN_NOT_LOGIN_ERROR.getResult()) || e.getMessage().equals(ServiceResultEnum.ADMIN_TOKEN_EXPIRE_ERROR.getResult())) { result.setResultCode(419); } if (e.getMessage().equals(ServiceResultEnum.NOT_LOGIN_ERROR.getResult()) || e.getMessage().equals(ServiceResultEnum.TOKEN_EXPIRE_ERROR.getResult())) { result.setResultCode(416); } } else { e.printStackTrace(); result.setMessage("未知异常,请查看控制台日志并检查配置文件。"); } return result; } } ================================================ FILE: newbee-mall-cloud-goods-service/newbee-mall-cloud-goods-web/src/main/java/ltd/goods/cloud/newbee/config/GoodsServiceSwagger3Config.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.goods.cloud.newbee.config; import ltd.common.cloud.newbee.pojo.MallUserToken; import ltd.common.cloud.newbee.pojo.AdminUserToken; import ltd.goods.cloud.newbee.entity.LoginAdminUser; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.builders.RequestParameterBuilder; import springfox.documentation.oas.annotations.EnableOpenApi; import springfox.documentation.schema.ScalarType; import springfox.documentation.service.ApiInfo; import springfox.documentation.service.ParameterType; import springfox.documentation.service.RequestParameter; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket; import java.util.ArrayList; import java.util.List; @Configuration @EnableOpenApi public class GoodsServiceSwagger3Config{ @Bean public Docket api() { return new Docket(DocumentationType.OAS_30) .apiInfo(apiInfo()) .ignoredParameterTypes(AdminUserToken.class, LoginAdminUser.class, MallUserToken.class) .select() .apis(RequestHandlerSelectors.basePackage("ltd.goods.cloud.newbee.controller")) .paths(PathSelectors.any()) .build() .globalRequestParameters(getGlobalRequestParameters()); } //生成全局通用参数 private List getGlobalRequestParameters() { List parameters = new ArrayList<>(); parameters.add(new RequestParameterBuilder() .name("token") .description("登录认证token") .required(false) // 非必传 .in(ParameterType.HEADER) //请求头中的参数,其它类型可以点进ParameterType类中查看 .query(q -> q.model(m -> m.scalarModel(ScalarType.STRING))) .build()); return parameters; } private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("newbee-mall-cloud-goods-service接口文档") .description("swagger接口文档") .version("2.0") .build(); } } ================================================ FILE: newbee-mall-cloud-goods-service/newbee-mall-cloud-goods-web/src/main/java/ltd/goods/cloud/newbee/config/GoodsServiceWebMvcConfigurer.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.goods.cloud.newbee.config; import com.alibaba.cloud.seata.web.SeataHandlerInterceptor; import com.alibaba.cloud.sentinel.SentinelProperties; import com.alibaba.csp.sentinel.adapter.spring.webmvc.SentinelWebInterceptor; import ltd.goods.cloud.newbee.config.handler.TokenToAdminUserMethodArgumentResolver; import ltd.goods.cloud.newbee.config.handler.TokenToMallUserMethodArgumentResolver; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Lazy; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; import java.util.List; import java.util.Optional; @Configuration public class GoodsServiceWebMvcConfigurer extends WebMvcConfigurationSupport { private static final Logger log = LoggerFactory.getLogger(GoodsServiceWebMvcConfigurer.class); @Autowired private SentinelProperties sentinelProperties; @Autowired private Optional sentinelWebInterceptorOptional; @Autowired @Lazy private TokenToAdminUserMethodArgumentResolver tokenToAdminUserMethodArgumentResolver; @Autowired @Lazy private TokenToMallUserMethodArgumentResolver tokenToMallUserMethodArgumentResolver; /** * @param argumentResolvers * @tip @TokenToAdminUser 注解处理方法 */ public void addArgumentResolvers(List argumentResolvers) { argumentResolvers.add(tokenToAdminUserMethodArgumentResolver); argumentResolvers.add(tokenToMallUserMethodArgumentResolver); } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry. addResourceHandler("/swagger-ui/**") .addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/") .resourceChain(false); } public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new SeataHandlerInterceptor()).addPathPatterns("/**"); if (this.sentinelWebInterceptorOptional.isPresent()) { SentinelProperties.Filter filterConfig = this.sentinelProperties.getFilter(); registry.addInterceptor((HandlerInterceptor) this.sentinelWebInterceptorOptional.get()).order(filterConfig.getOrder()).addPathPatterns(filterConfig.getUrlPatterns()); log.info("[Sentinel Starter] register SentinelWebInterceptor with urlPatterns: {}.", filterConfig.getUrlPatterns()); } } } ================================================ FILE: newbee-mall-cloud-goods-service/newbee-mall-cloud-goods-web/src/main/java/ltd/goods/cloud/newbee/config/OpenFeignConfiguration.java ================================================ package ltd.goods.cloud.newbee.config; import feign.Logger; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class OpenFeignConfiguration { @Bean public Logger.Level openFeignLogLevel() { // 设置OpenFeign日志级别 return Logger.Level.FULL; } } ================================================ FILE: newbee-mall-cloud-goods-service/newbee-mall-cloud-goods-web/src/main/java/ltd/goods/cloud/newbee/config/SeataProxyConfiguration.java ================================================ package ltd.goods.cloud.newbee.config; import com.alibaba.druid.pool.DruidDataSource; import io.seata.rm.datasource.DataSourceProxy; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import javax.annotation.PostConstruct; import javax.sql.DataSource; @Configuration public class SeataProxyConfiguration { //创建Druid数据源 @Bean @ConfigurationProperties(prefix = "spring.datasource") public DruidDataSource druidDataSource() { return new DruidDataSource(); } //创建DataSource数据源代理 @Bean("dataSource") @Primary public DataSource dataSourceDelegation(DruidDataSource druidDataSource) { return new DataSourceProxy(druidDataSource); } /* * 解决druid 日志报错:discard long time none received connection:xxx * */ @PostConstruct public void setProperties(){ System.setProperty("druid.mysql.usePingMethod","false"); } } ================================================ FILE: newbee-mall-cloud-goods-service/newbee-mall-cloud-goods-web/src/main/java/ltd/goods/cloud/newbee/config/annotation/TokenToAdminUser.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.goods.cloud.newbee.config.annotation; import java.lang.annotation.*; @Target({ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface TokenToAdminUser { /** * 当前用户在request中的名字 * * @return */ String value() default "adminUser"; } ================================================ FILE: newbee-mall-cloud-goods-service/newbee-mall-cloud-goods-web/src/main/java/ltd/goods/cloud/newbee/config/annotation/TokenToMallUser.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.goods.cloud.newbee.config.annotation; import java.lang.annotation.*; @Target({ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface TokenToMallUser { /** * 当前用户在request中的名字 * * @return */ String value() default "user"; } ================================================ FILE: newbee-mall-cloud-goods-service/newbee-mall-cloud-goods-web/src/main/java/ltd/goods/cloud/newbee/config/handler/TokenToAdminUserMethodArgumentResolver.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.goods.cloud.newbee.config.handler; import ltd.common.cloud.newbee.enums.ServiceResultEnum; import ltd.common.cloud.newbee.dto.Result; import ltd.common.cloud.newbee.exception.NewBeeMallException; import ltd.goods.cloud.newbee.config.annotation.TokenToAdminUser; import ltd.goods.cloud.newbee.entity.LoginAdminUser; import ltd.user.cloud.newbee.openfeign.NewBeeCloudUserServiceFeign; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.MethodParameter; import org.springframework.stereotype.Component; import org.springframework.web.bind.support.WebDataBinderFactory; import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.method.support.ModelAndViewContainer; import java.util.LinkedHashMap; @Component public class TokenToAdminUserMethodArgumentResolver implements HandlerMethodArgumentResolver { @Autowired private NewBeeCloudUserServiceFeign newBeeCloudUserService; public TokenToAdminUserMethodArgumentResolver() { } public boolean supportsParameter(MethodParameter parameter) { if (parameter.hasParameterAnnotation(TokenToAdminUser.class)) { return true; } return false; } public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) { if (parameter.getParameterAnnotation(TokenToAdminUser.class) instanceof TokenToAdminUser) { String token = webRequest.getHeader("token"); if (null != token && !"".equals(token) && token.length() == 32) { // 通过用户中心获取用户信息 Result result = newBeeCloudUserService.getAdminUserByToken(token); if (result == null || result.getResultCode() != 200 || result.getData() == null) { NewBeeMallException.fail(ServiceResultEnum.ADMIN_NOT_LOGIN_ERROR.getResult()); } LinkedHashMap resultData = (LinkedHashMap) result.getData(); // 将返回的字段封装到LoginAdminUser对象中 LoginAdminUser loginAdminUser = new LoginAdminUser(); loginAdminUser.setAdminUserId(Long.valueOf(resultData.get("adminUserId").toString())); loginAdminUser.setLoginUserName((String) resultData.get("loginUserName")); loginAdminUser.setNickName((String) resultData.get("nickName")); loginAdminUser.setLocked(Byte.valueOf(resultData.get("locked").toString())); return loginAdminUser; } else { NewBeeMallException.fail(ServiceResultEnum.ADMIN_NOT_LOGIN_ERROR.getResult()); } } return null; } } ================================================ FILE: newbee-mall-cloud-goods-service/newbee-mall-cloud-goods-web/src/main/java/ltd/goods/cloud/newbee/config/handler/TokenToMallUserMethodArgumentResolver.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.goods.cloud.newbee.config.handler; import ltd.common.cloud.newbee.enums.ServiceResultEnum; import ltd.common.cloud.newbee.dto.Result; import ltd.common.cloud.newbee.exception.NewBeeMallException; import ltd.common.cloud.newbee.pojo.MallUserToken; import ltd.goods.cloud.newbee.config.annotation.TokenToMallUser; import ltd.user.cloud.newbee.dto.MallUserDTO; import ltd.user.cloud.newbee.openfeign.NewBeeCloudUserServiceFeign; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.MethodParameter; import org.springframework.stereotype.Component; import org.springframework.web.bind.support.WebDataBinderFactory; import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.method.support.ModelAndViewContainer; @Component public class TokenToMallUserMethodArgumentResolver implements HandlerMethodArgumentResolver { @Autowired private NewBeeCloudUserServiceFeign newBeeCloudUserService; public TokenToMallUserMethodArgumentResolver() { } public boolean supportsParameter(MethodParameter parameter) { if (parameter.hasParameterAnnotation(TokenToMallUser.class)) { return true; } return false; } public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) { if (parameter.getParameterAnnotation(TokenToMallUser.class) instanceof TokenToMallUser) { String token = webRequest.getHeader("token"); if (null != token && !"".equals(token) && token.length() == 32) { Result result = newBeeCloudUserService.getMallUserByToken(token); if (result == null || result.getResultCode() != 200 || result.getData() == null) { NewBeeMallException.fail(ServiceResultEnum.TOKEN_EXPIRE_ERROR.getResult()); } MallUserToken mallUserToken = new MallUserToken(); mallUserToken.setToken(token); mallUserToken.setUserId(result.getData().getUserId()); return mallUserToken; } else { NewBeeMallException.fail(ServiceResultEnum.NOT_LOGIN_ERROR.getResult()); } } return null; } } ================================================ FILE: newbee-mall-cloud-goods-service/newbee-mall-cloud-goods-web/src/main/java/ltd/goods/cloud/newbee/controller/NewBeeAdminGoodsCategoryController.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本系统已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.goods.cloud.newbee.controller; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import ltd.common.cloud.newbee.enums.NewBeeMallCategoryLevelEnum; import ltd.common.cloud.newbee.enums.ServiceResultEnum; import ltd.common.cloud.newbee.dto.PageQueryUtil; import ltd.common.cloud.newbee.dto.Result; import ltd.common.cloud.newbee.dto.ResultGenerator; import ltd.common.cloud.newbee.util.BeanUtil; import ltd.goods.cloud.newbee.config.annotation.TokenToAdminUser; import ltd.goods.cloud.newbee.controller.param.BatchIdParam; import ltd.goods.cloud.newbee.controller.param.GoodsCategoryAddParam; import ltd.goods.cloud.newbee.controller.param.GoodsCategoryEditParam; import ltd.goods.cloud.newbee.entity.GoodsCategory; import ltd.goods.cloud.newbee.entity.LoginAdminUser; import ltd.goods.cloud.newbee.service.NewBeeMallCategoryService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.validation.Valid; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @author 13 * @qq交流群 796794009 * @email 2449207463@qq.com * @link https://github.com/newbee-ltd */ @RestController @Api(value = "v1", tags = "后台管理系统分类模块接口") @RequestMapping("/categories/admin") public class NewBeeAdminGoodsCategoryController { private static final Logger logger = LoggerFactory.getLogger(NewBeeAdminGoodsCategoryController.class); @Resource private NewBeeMallCategoryService newBeeMallCategoryService; /** * 列表 */ @RequestMapping(value = "/list", method = RequestMethod.GET) @ApiOperation(value = "商品分类列表", notes = "根据级别和上级分类id查询") public Result list(@RequestParam(required = false) @ApiParam(value = "页码") Integer pageNumber, @RequestParam(required = false) @ApiParam(value = "每页条数") Integer pageSize, @RequestParam(required = false) @ApiParam(value = "分类级别") Integer categoryLevel, @RequestParam(required = false) @ApiParam(value = "上级分类的id") Long parentId, @TokenToAdminUser LoginAdminUser adminUser) { logger.info("adminUser:{}", adminUser.toString()); if (pageNumber == null || pageNumber < 1 || pageSize == null || pageSize < 10 || categoryLevel == null || categoryLevel < 0 || categoryLevel > 3 || parentId == null || parentId < 0) { return ResultGenerator.genFailResult("分页参数异常!"); } Map params = new HashMap(8); params.put("page", pageNumber); params.put("limit", pageSize); params.put("categoryLevel", categoryLevel); params.put("parentId", parentId); PageQueryUtil pageUtil = new PageQueryUtil(params); return ResultGenerator.genSuccessResult(newBeeMallCategoryService.getCategorisPage(pageUtil)); } /** * 列表 */ @RequestMapping(value = "/list4Select", method = RequestMethod.GET) @ApiOperation(value = "商品分类列表", notes = "用于三级分类联动效果制作") public Result listForSelect(@RequestParam("categoryId") Long categoryId, @TokenToAdminUser LoginAdminUser adminUser) { logger.info("adminUser:{}", adminUser.toString()); if (categoryId == null || categoryId < 1) { return ResultGenerator.genFailResult("缺少参数!"); } GoodsCategory category = newBeeMallCategoryService.getGoodsCategoryById(categoryId); //既不是一级分类也不是二级分类则为不返回数据 if (category == null || category.getCategoryLevel() == NewBeeMallCategoryLevelEnum.LEVEL_THREE.getLevel()) { return ResultGenerator.genFailResult("参数异常!"); } Map categoryResult = new HashMap(4); if (category.getCategoryLevel() == NewBeeMallCategoryLevelEnum.LEVEL_ONE.getLevel()) { //如果是一级分类则返回当前一级分类下的所有二级分类,以及二级分类列表中第一条数据下的所有三级分类列表 //查询一级分类列表中第一个实体的所有二级分类 List secondLevelCategories = newBeeMallCategoryService.selectByLevelAndParentIdsAndNumber(Collections.singletonList(categoryId), NewBeeMallCategoryLevelEnum.LEVEL_TWO.getLevel()); if (!CollectionUtils.isEmpty(secondLevelCategories)) { //查询二级分类列表中第一个实体的所有三级分类 List thirdLevelCategories = newBeeMallCategoryService.selectByLevelAndParentIdsAndNumber(Collections.singletonList(secondLevelCategories.get(0).getCategoryId()), NewBeeMallCategoryLevelEnum.LEVEL_THREE.getLevel()); categoryResult.put("secondLevelCategories", secondLevelCategories); categoryResult.put("thirdLevelCategories", thirdLevelCategories); } } if (category.getCategoryLevel() == NewBeeMallCategoryLevelEnum.LEVEL_TWO.getLevel()) { //如果是二级分类则返回当前分类下的所有三级分类列表 List thirdLevelCategories = newBeeMallCategoryService.selectByLevelAndParentIdsAndNumber(Collections.singletonList(categoryId), NewBeeMallCategoryLevelEnum.LEVEL_THREE.getLevel()); categoryResult.put("thirdLevelCategories", thirdLevelCategories); } return ResultGenerator.genSuccessResult(categoryResult); } /** * 添加 */ @RequestMapping(value = "/add", method = RequestMethod.POST) @ApiOperation(value = "新增分类", notes = "新增分类") public Result save(@RequestBody @Valid GoodsCategoryAddParam goodsCategoryAddParam, @TokenToAdminUser LoginAdminUser adminUser) { logger.info("adminUser:{}", adminUser.toString()); GoodsCategory goodsCategory = new GoodsCategory(); BeanUtil.copyProperties(goodsCategoryAddParam, goodsCategory); String result = newBeeMallCategoryService.saveCategory(goodsCategory); if (ServiceResultEnum.SUCCESS.getResult().equals(result)) { return ResultGenerator.genSuccessResult(); } else { return ResultGenerator.genFailResult(result); } } /** * 修改 */ @RequestMapping(value = "/update", method = RequestMethod.PUT) @ApiOperation(value = "修改分类信息", notes = "修改分类信息") public Result update(@RequestBody @Valid GoodsCategoryEditParam goodsCategoryEditParam, @TokenToAdminUser LoginAdminUser adminUser) { logger.info("adminUser:{}", adminUser.toString()); GoodsCategory goodsCategory = new GoodsCategory(); BeanUtil.copyProperties(goodsCategoryEditParam, goodsCategory); String result = newBeeMallCategoryService.updateGoodsCategory(goodsCategory); if (ServiceResultEnum.SUCCESS.getResult().equals(result)) { return ResultGenerator.genSuccessResult(); } else { return ResultGenerator.genFailResult(result); } } /** * 详情 */ @RequestMapping(value = "/detail/{id}", method = RequestMethod.GET) @ApiOperation(value = "获取单条分类信息", notes = "根据id查询") public Result info(@PathVariable("id") Long id, @TokenToAdminUser LoginAdminUser adminUser) { logger.info("adminUser:{}", adminUser.toString()); GoodsCategory goodsCategory = newBeeMallCategoryService.getGoodsCategoryById(id); if (goodsCategory == null) { return ResultGenerator.genFailResult("未查询到数据"); } return ResultGenerator.genSuccessResult(goodsCategory); } /** * 分类删除 */ @RequestMapping(value = "/batchDelete", method = RequestMethod.DELETE) @ApiOperation(value = "批量删除分类信息", notes = "批量删除分类信息") public Result delete(@RequestBody BatchIdParam batchIdParam, @TokenToAdminUser LoginAdminUser adminUser) { logger.info("adminUser:{}", adminUser.toString()); if (batchIdParam == null || batchIdParam.getIds().length < 1) { return ResultGenerator.genFailResult("参数异常!"); } if (newBeeMallCategoryService.deleteBatch(batchIdParam.getIds())) { return ResultGenerator.genSuccessResult(); } else { return ResultGenerator.genFailResult("删除失败"); } } } ================================================ FILE: newbee-mall-cloud-goods-service/newbee-mall-cloud-goods-web/src/main/java/ltd/goods/cloud/newbee/controller/NewBeeAdminGoodsInfoController.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本系统已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.goods.cloud.newbee.controller; import io.seata.core.context.RootContext; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import ltd.common.cloud.newbee.enums.ServiceResultEnum; import ltd.common.cloud.newbee.dto.PageQueryUtil; import ltd.common.cloud.newbee.dto.Result; import ltd.common.cloud.newbee.dto.ResultGenerator; import ltd.common.cloud.newbee.util.BeanUtil; import ltd.goods.cloud.newbee.config.annotation.TokenToAdminUser; import ltd.goods.cloud.newbee.controller.param.BatchIdParam; import ltd.goods.cloud.newbee.controller.param.GoodsAddParam; import ltd.goods.cloud.newbee.controller.param.GoodsEditParam; import ltd.goods.cloud.newbee.entity.GoodsCategory; import ltd.goods.cloud.newbee.entity.LoginAdminUser; import ltd.goods.cloud.newbee.entity.NewBeeMallGoods; import ltd.goods.cloud.newbee.entity.UpdateStockNumDTO; import ltd.goods.cloud.newbee.service.NewBeeMallCategoryService; import ltd.goods.cloud.newbee.service.NewBeeMallGoodsService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.validation.Valid; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @author 13 * @qq交流群 796794009 * @email 2449207463@qq.com * @link https://github.com/newbee-ltd */ @RestController @Api(value = "v1", tags = "后台管理系统商品模块接口") @RequestMapping("/goods/admin") public class NewBeeAdminGoodsInfoController { private static final Logger logger = LoggerFactory.getLogger(NewBeeAdminGoodsInfoController.class); @Resource private NewBeeMallGoodsService newBeeMallGoodsService; @Resource private NewBeeMallCategoryService newBeeMallCategoryService; /** * 列表 */ @RequestMapping(value = "/list", method = RequestMethod.GET) @ApiOperation(value = "商品列表", notes = "可根据名称和上架状态筛选") public Result list(@RequestParam(required = false) @ApiParam(value = "页码") Integer pageNumber, @RequestParam(required = false) @ApiParam(value = "每页条数") Integer pageSize, @RequestParam(required = false) @ApiParam(value = "商品名称") String goodsName, @RequestParam(required = false) @ApiParam(value = "上架状态 0-上架 1-下架") Integer goodsSellStatus, @TokenToAdminUser LoginAdminUser adminUser) { logger.info("adminUser:{}", adminUser.toString()); if (pageNumber == null || pageNumber < 1 || pageSize == null || pageSize < 10) { return ResultGenerator.genFailResult("分页参数异常!"); } Map params = new HashMap(8); params.put("page", pageNumber); params.put("limit", pageSize); if (StringUtils.hasText(goodsName)) { params.put("goodsName", goodsName); } if (goodsSellStatus != null) { params.put("goodsSellStatus", goodsSellStatus); } PageQueryUtil pageUtil = new PageQueryUtil(params); return ResultGenerator.genSuccessResult(newBeeMallGoodsService.getNewBeeMallGoodsPage(pageUtil)); } /** * 添加 */ @RequestMapping(value = "/add", method = RequestMethod.POST) @ApiOperation(value = "新增商品信息", notes = "新增商品信息") public Result save(@RequestBody @Valid GoodsAddParam goodsAddParam, @TokenToAdminUser LoginAdminUser adminUser) { logger.info("adminUser:{}", adminUser.toString()); NewBeeMallGoods newBeeMallGoods = new NewBeeMallGoods(); BeanUtil.copyProperties(goodsAddParam, newBeeMallGoods); String result = newBeeMallGoodsService.saveNewBeeMallGoods(newBeeMallGoods); if (ServiceResultEnum.SUCCESS.getResult().equals(result)) { return ResultGenerator.genSuccessResult(); } else { return ResultGenerator.genFailResult(result); } } /** * 修改 */ @RequestMapping(value = "/update", method = RequestMethod.PUT) @ApiOperation(value = "修改商品信息", notes = "修改商品信息") public Result update(@RequestBody @Valid GoodsEditParam goodsEditParam, @TokenToAdminUser LoginAdminUser adminUser) { logger.info("adminUser:{}", adminUser.toString()); NewBeeMallGoods newBeeMallGoods = new NewBeeMallGoods(); BeanUtil.copyProperties(goodsEditParam, newBeeMallGoods); String result = newBeeMallGoodsService.updateNewBeeMallGoods(newBeeMallGoods); if (ServiceResultEnum.SUCCESS.getResult().equals(result)) { return ResultGenerator.genSuccessResult(); } else { return ResultGenerator.genFailResult(result); } } /** * 详情 */ @GetMapping("/detail/{id}") @ApiOperation(value = "获取单条商品信息", notes = "根据id查询") public Result info(@PathVariable("id") Long id, @TokenToAdminUser LoginAdminUser adminUser) { logger.info("adminUser:{}", adminUser.toString()); Map goodsInfo = new HashMap(8); NewBeeMallGoods goods = newBeeMallGoodsService.getNewBeeMallGoodsById(id); if (goods == null) { return ResultGenerator.genFailResult(ServiceResultEnum.DATA_NOT_EXIST.getResult()); } goodsInfo.put("goods", goods); GoodsCategory thirdCategory; GoodsCategory secondCategory; GoodsCategory firstCategory; thirdCategory = newBeeMallCategoryService.getGoodsCategoryById(goods.getGoodsCategoryId()); if (thirdCategory != null) { goodsInfo.put("thirdCategory", thirdCategory); secondCategory = newBeeMallCategoryService.getGoodsCategoryById(thirdCategory.getParentId()); if (secondCategory != null) { goodsInfo.put("secondCategory", secondCategory); firstCategory = newBeeMallCategoryService.getGoodsCategoryById(secondCategory.getParentId()); if (firstCategory != null) { goodsInfo.put("firstCategory", firstCategory); } } } return ResultGenerator.genSuccessResult(goodsInfo); } /** * 批量修改销售状态 */ @RequestMapping(value = "/updateStatus/{sellStatus}", method = RequestMethod.PUT) @ApiOperation(value = "批量修改销售状态", notes = "批量修改销售状态") public Result delete(@RequestBody BatchIdParam batchIdParam, @PathVariable("sellStatus") int sellStatus, @TokenToAdminUser LoginAdminUser adminUser) { logger.info("adminUser:{}", adminUser.toString()); if (batchIdParam == null || batchIdParam.getIds().length < 1) { return ResultGenerator.genFailResult("参数异常!"); } if (sellStatus != 0 && sellStatus != 1) { return ResultGenerator.genFailResult("状态异常!"); } if (newBeeMallGoodsService.batchUpdateSellStatus(batchIdParam.getIds(), sellStatus)) { return ResultGenerator.genSuccessResult(); } else { return ResultGenerator.genFailResult("修改失败"); } } /** * 详情 */ @GetMapping("/goodsDetail") @ApiOperation(value = "获取单条商品信息", notes = "根据id查询") public Result goodsDetail(@RequestParam("goodsId") Long goodsId) { NewBeeMallGoods goods = newBeeMallGoodsService.getNewBeeMallGoodsById(goodsId); return ResultGenerator.genSuccessResult(goods); } /** * 根据ids查询商品列表 */ @GetMapping("/listByGoodsIds") @ApiOperation(value = "根据ids查询商品列表", notes = "根据ids查询") public Result getNewBeeMallGoodsByIds(@RequestParam("goodsIds") List goodsIds) { List newBeeMallGoods = newBeeMallGoodsService.getNewBeeMallGoodsByIds(goodsIds); return ResultGenerator.genSuccessResult(newBeeMallGoods); } /** * 修改库存 */ @PutMapping("/updateStock") @ApiOperation(value = "修改库存", notes = "") public Result updateStock(@RequestBody UpdateStockNumDTO updateStockNumDTO) { System.out.println("RootContext.getXID()="+RootContext.getXID()); return ResultGenerator.genSuccessResult(newBeeMallGoodsService.updateStockNum(updateStockNumDTO.getStockNumDTOS())); } } ================================================ FILE: newbee-mall-cloud-goods-service/newbee-mall-cloud-goods-web/src/main/java/ltd/goods/cloud/newbee/controller/NewBeeMallGoodsCategoryController.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.goods.cloud.newbee.controller; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import ltd.common.cloud.newbee.enums.ServiceResultEnum; import ltd.common.cloud.newbee.dto.Result; import ltd.common.cloud.newbee.dto.ResultGenerator; import ltd.common.cloud.newbee.exception.NewBeeMallException; import ltd.goods.cloud.newbee.controller.vo.NewBeeMallIndexCategoryVO; import ltd.goods.cloud.newbee.service.NewBeeMallCategoryService; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.util.List; @RestController @Api(value = "v1", tags = "新蜂商城分类页面接口") @RequestMapping("/categories/mall") public class NewBeeMallGoodsCategoryController { @Resource private NewBeeMallCategoryService newBeeMallCategoryService; @GetMapping("/listAll") @ApiOperation(value = "获取分类数据", notes = "分类页面使用") public Result> getCategories() { List categories = newBeeMallCategoryService.getCategoriesForIndex(); if (CollectionUtils.isEmpty(categories)) { NewBeeMallException.fail(ServiceResultEnum.DATA_NOT_EXIST.getResult()); } return ResultGenerator.genSuccessResult(categories); } } ================================================ FILE: newbee-mall-cloud-goods-service/newbee-mall-cloud-goods-web/src/main/java/ltd/goods/cloud/newbee/controller/NewBeeMallGoodsController.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.goods.cloud.newbee.controller; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import ltd.common.cloud.newbee.enums.ServiceResultEnum; import ltd.common.cloud.newbee.dto.PageQueryUtil; import ltd.common.cloud.newbee.dto.PageResult; import ltd.common.cloud.newbee.dto.Result; import ltd.common.cloud.newbee.dto.ResultGenerator; import ltd.common.cloud.newbee.exception.NewBeeMallException; import ltd.common.cloud.newbee.pojo.MallUserToken; import ltd.common.cloud.newbee.util.BeanUtil; import ltd.goods.cloud.newbee.config.annotation.TokenToMallUser; import ltd.goods.cloud.newbee.controller.vo.NewBeeMallGoodsDetailVO; import ltd.goods.cloud.newbee.controller.vo.NewBeeMallSearchGoodsVO; import ltd.goods.cloud.newbee.entity.NewBeeMallGoods; import ltd.goods.cloud.newbee.service.NewBeeMallGoodsService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.StringUtils; import org.springframework.validation.BindException; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @RestController @Api(value = "v1", tags = "新蜂商城商品相关接口") @RequestMapping("/goods/mall") public class NewBeeMallGoodsController { private static final Logger logger = LoggerFactory.getLogger(NewBeeMallGoodsController.class); @Resource private NewBeeMallGoodsService newBeeMallGoodsService; @GetMapping("/test1") public Result test1() throws BindException { throw new BindException(1,"BindException"); } @GetMapping("/test2") public Result test2() throws NewBeeMallException { NewBeeMallException.fail("NewBeeMallException"); return ResultGenerator.genSuccessResult("test2"); } @GetMapping("/test3") public Result test3() throws Exception { int i=1/0; return ResultGenerator.genSuccessResult("test2"); } @GetMapping("/search") @ApiOperation(value = "商品搜索接口", notes = "根据关键字和分类id进行搜索") public Result>> search(@RequestParam(required = false) @ApiParam(value = "搜索关键字") String keyword, @RequestParam(required = false) @ApiParam(value = "分类id") Long goodsCategoryId, @RequestParam(required = false) @ApiParam(value = "orderBy") String orderBy, @RequestParam(required = false) @ApiParam(value = "页码") Integer pageNumber, @TokenToMallUser MallUserToken loginMallUserToken) { logger.info("goods search api,keyword={},goodsCategoryId={},orderBy={},pageNumber={},userId={}", keyword, goodsCategoryId, orderBy, pageNumber, loginMallUserToken.getUserId()); Map params = new HashMap(8); //两个搜索参数都为空,直接返回异常 if (goodsCategoryId == null && !StringUtils.hasText(keyword)) { NewBeeMallException.fail("非法的搜索参数"); } if (pageNumber == null || pageNumber < 1) { pageNumber = 1; } params.put("goodsCategoryId", goodsCategoryId); params.put("page", pageNumber); params.put("limit", 10); //对keyword做过滤 去掉空格 if (StringUtils.hasText(keyword)) { params.put("keyword", keyword); } if (StringUtils.hasText(orderBy)) { params.put("orderBy", orderBy); } //搜索上架状态下的商品 params.put("goodsSellStatus", 0); //封装商品数据 PageQueryUtil pageUtil = new PageQueryUtil(params); return ResultGenerator.genSuccessResult(newBeeMallGoodsService.searchNewBeeMallGoods(pageUtil)); } @GetMapping("/detail/{goodsId}") @ApiOperation(value = "商品详情接口", notes = "传参为商品id") public Result goodsDetail(@ApiParam(value = "商品id") @PathVariable("goodsId") Long goodsId, @TokenToMallUser MallUserToken loginMallUserToken) { logger.info("goods detail api,goodsId={},userId={}", goodsId, loginMallUserToken.getUserId()); if (goodsId < 1) { return ResultGenerator.genFailResult("参数异常"); } NewBeeMallGoods goods = newBeeMallGoodsService.getNewBeeMallGoodsById(goodsId); if (0 != goods.getGoodsSellStatus()) { NewBeeMallException.fail(ServiceResultEnum.GOODS_PUT_DOWN.getResult()); } NewBeeMallGoodsDetailVO goodsDetailVO = new NewBeeMallGoodsDetailVO(); BeanUtil.copyProperties(goods, goodsDetailVO); goodsDetailVO.setGoodsCarouselList(goods.getGoodsCarousel().split(",")); return ResultGenerator.genSuccessResult(goodsDetailVO); } } ================================================ FILE: newbee-mall-cloud-goods-service/newbee-mall-cloud-goods-web/src/main/java/ltd/goods/cloud/newbee/controller/param/BatchIdParam.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.goods.cloud.newbee.controller.param; import lombok.Data; import java.io.Serializable; @Data public class BatchIdParam implements Serializable { //id数组 Long[] ids; } ================================================ FILE: newbee-mall-cloud-goods-service/newbee-mall-cloud-goods-web/src/main/java/ltd/goods/cloud/newbee/controller/param/GoodsAddParam.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.goods.cloud.newbee.controller.param; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.hibernate.validator.constraints.Length; import javax.validation.constraints.Max; import javax.validation.constraints.Min; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; @Data public class GoodsAddParam { @ApiModelProperty("商品名称") @NotEmpty(message = "商品名称不能为空") @Length(max = 128,message = "商品名称内容过长") private String goodsName; @ApiModelProperty("商品简介") @NotEmpty(message = "商品简介不能为空") @Length(max = 200,message = "商品简介内容过长") private String goodsIntro; @ApiModelProperty("分类id") @NotNull(message = "分类id不能为空") @Min(value = 1, message = "分类id最低为1") private Long goodsCategoryId; @ApiModelProperty("商品主图") @NotEmpty(message = "商品主图不能为空") private String goodsCoverImg; @ApiModelProperty("originalPrice") @NotNull(message = "originalPrice不能为空") @Min(value = 1, message = "originalPrice最低为1") @Max(value = 1000000, message = "originalPrice最高为1000000") private Integer originalPrice; @ApiModelProperty("sellingPrice") @NotNull(message = "sellingPrice不能为空") @Min(value = 1, message = "sellingPrice最低为1") @Max(value = 1000000, message = "sellingPrice最高为1000000") private Integer sellingPrice; @ApiModelProperty("库存") @NotNull(message = "库存不能为空") @Min(value = 1, message = "库存最低为1") @Max(value = 100000, message = "库存最高为100000") private Integer stockNum; @ApiModelProperty("商品标签") @NotEmpty(message = "商品标签不能为空") @Length(max = 16,message = "商品标签内容过长") private String tag; private Byte goodsSellStatus; @ApiModelProperty("商品详情") @NotEmpty(message = "商品详情不能为空") private String goodsDetailContent; } ================================================ FILE: newbee-mall-cloud-goods-service/newbee-mall-cloud-goods-web/src/main/java/ltd/goods/cloud/newbee/controller/param/GoodsCategoryAddParam.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.goods.cloud.newbee.controller.param; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.hibernate.validator.constraints.Length; import javax.validation.constraints.Max; import javax.validation.constraints.Min; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; @Data public class GoodsCategoryAddParam { @ApiModelProperty("分类层级") @NotNull(message = "categoryLevel不能为空") @Min(value = 1, message = "分类级别最低为1") @Max(value = 3, message = "分类级别最高为3") private Byte categoryLevel; @ApiModelProperty("父类id") @NotNull(message = "parentId不能为空") @Min(value = 0, message = "parentId最低为0") private Long parentId; @ApiModelProperty("分类名称") @NotEmpty(message = "categoryName不能为空") @Length(max = 16,message = "分类名称过长") private String categoryName; @ApiModelProperty("排序值") @Min(value = 1, message = "categoryRank最低为1") @Max(value = 200, message = "categoryRank最高为200") @NotNull(message = "categoryRank不能为空") private Integer categoryRank; } ================================================ FILE: newbee-mall-cloud-goods-service/newbee-mall-cloud-goods-web/src/main/java/ltd/goods/cloud/newbee/controller/param/GoodsCategoryEditParam.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.goods.cloud.newbee.controller.param; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.hibernate.validator.constraints.Length; import javax.validation.constraints.Max; import javax.validation.constraints.Min; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; @Data public class GoodsCategoryEditParam { @ApiModelProperty("待修改分类id") @NotNull(message = "分类id不能为空") @Min(value = 1, message = "分类id不能为空") private Long categoryId; @ApiModelProperty("分类层级") @NotNull(message = "categoryLevel不能为空") @Min(value = 1, message = "分类级别最低为1") @Max(value = 3, message = "分类级别最高为3") private Byte categoryLevel; @ApiModelProperty("父类id") @NotNull(message = "parentId不能为空") @Min(value = 0, message = "parentId最低为0") private Long parentId; @ApiModelProperty("分类名称") @NotEmpty(message = "categoryName不能为空") @Length(max = 16,message = "分类名称过长") private String categoryName; @ApiModelProperty("排序值") @Min(value = 1, message = "categoryRank最低为1") @Max(value = 200, message = "categoryRank最高为200") @NotNull(message = "categoryRank不能为空") private Integer categoryRank; } ================================================ FILE: newbee-mall-cloud-goods-service/newbee-mall-cloud-goods-web/src/main/java/ltd/goods/cloud/newbee/controller/param/GoodsEditParam.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.goods.cloud.newbee.controller.param; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.hibernate.validator.constraints.Length; import javax.validation.constraints.Max; import javax.validation.constraints.Min; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; @Data public class GoodsEditParam { @ApiModelProperty("待修改商品id") @NotNull(message = "商品id不能为空") @Min(value = 1, message = "商品id不能为空") private Long goodsId; @ApiModelProperty("商品名称") @NotEmpty(message = "商品名称不能为空") @Length(max = 128,message = "商品名称内容过长") private String goodsName; @ApiModelProperty("商品简介") @NotEmpty(message = "商品简介不能为空") @Length(max = 200,message = "商品简介内容过长") private String goodsIntro; @ApiModelProperty("分类id") @NotNull(message = "分类id不能为空") @Min(value = 1, message = "分类id最低为1") private Long goodsCategoryId; @ApiModelProperty("商品主图") @NotEmpty(message = "商品主图不能为空") private String goodsCoverImg; @ApiModelProperty("originalPrice") @NotNull(message = "originalPrice不能为空") @Min(value = 1, message = "originalPrice最低为1") @Max(value = 1000000, message = "originalPrice最高为1000000") private Integer originalPrice; @ApiModelProperty("sellingPrice") @NotNull(message = "sellingPrice不能为空") @Min(value = 1, message = "sellingPrice最低为1") @Max(value = 1000000, message = "sellingPrice最高为1000000") private Integer sellingPrice; @ApiModelProperty("库存") @NotNull(message = "库存不能为空") @Min(value = 1, message = "库存最低为1") @Max(value = 100000, message = "库存最高为100000") private Integer stockNum; @ApiModelProperty("商品标签") @NotEmpty(message = "商品标签不能为空") @Length(max = 16,message = "商品标签内容过长") private String tag; private Byte goodsSellStatus; @ApiModelProperty("商品详情") @NotEmpty(message = "商品详情不能为空") private String goodsDetailContent; } ================================================ FILE: newbee-mall-cloud-goods-service/newbee-mall-cloud-goods-web/src/main/java/ltd/goods/cloud/newbee/controller/vo/NewBeeMallGoodsDetailVO.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.goods.cloud.newbee.controller.vo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; /** * 商品详情页VO */ @Data public class NewBeeMallGoodsDetailVO implements Serializable { @ApiModelProperty("商品id") private Long goodsId; @ApiModelProperty("商品名称") private String goodsName; @ApiModelProperty("商品简介") private String goodsIntro; @ApiModelProperty("商品图片地址") private String goodsCoverImg; @ApiModelProperty("商品价格") private Integer sellingPrice; @ApiModelProperty("商品标签") private String tag; @ApiModelProperty("商品图片") private String[] goodsCarouselList; @ApiModelProperty("商品原价") private Integer originalPrice; @ApiModelProperty("商品详情字段") private String goodsDetailContent; } ================================================ FILE: newbee-mall-cloud-goods-service/newbee-mall-cloud-goods-web/src/main/java/ltd/goods/cloud/newbee/controller/vo/NewBeeMallIndexCategoryVO.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.goods.cloud.newbee.controller.vo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; import java.util.List; /** * 首页分类数据VO */ @Data public class NewBeeMallIndexCategoryVO implements Serializable { @ApiModelProperty("当前一级分类id") private Long categoryId; @ApiModelProperty("当前分类级别") private Byte categoryLevel; @ApiModelProperty("当前一级分类名称") private String categoryName; @ApiModelProperty("二级分类列表") private List secondLevelCategoryVOS; } ================================================ FILE: newbee-mall-cloud-goods-service/newbee-mall-cloud-goods-web/src/main/java/ltd/goods/cloud/newbee/controller/vo/NewBeeMallSearchGoodsVO.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.goods.cloud.newbee.controller.vo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; /** * 搜索列表页商品VO */ @Data public class NewBeeMallSearchGoodsVO implements Serializable { @ApiModelProperty("商品id") private Long goodsId; @ApiModelProperty("商品名称") private String goodsName; @ApiModelProperty("商品简介") private String goodsIntro; @ApiModelProperty("商品图片地址") private String goodsCoverImg; @ApiModelProperty("商品价格") private Integer sellingPrice; } ================================================ FILE: newbee-mall-cloud-goods-service/newbee-mall-cloud-goods-web/src/main/java/ltd/goods/cloud/newbee/controller/vo/SecondLevelCategoryVO.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.goods.cloud.newbee.controller.vo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; import java.util.List; /** * 首页分类数据VO(第二级) */ @Data public class SecondLevelCategoryVO implements Serializable { @ApiModelProperty("当前二级分类id") private Long categoryId; @ApiModelProperty("父级分类id") private Long parentId; @ApiModelProperty("当前分类级别") private Byte categoryLevel; @ApiModelProperty("当前二级分类名称") private String categoryName; @ApiModelProperty("三级分类列表") private List thirdLevelCategoryVOS; } ================================================ FILE: newbee-mall-cloud-goods-service/newbee-mall-cloud-goods-web/src/main/java/ltd/goods/cloud/newbee/controller/vo/ThirdLevelCategoryVO.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.goods.cloud.newbee.controller.vo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; /** * 首页分类数据VO(第三级) */ @Data public class ThirdLevelCategoryVO implements Serializable { @ApiModelProperty("当前三级分类id") private Long categoryId; @ApiModelProperty("当前分类级别") private Byte categoryLevel; @ApiModelProperty("当前三级分类名称") private String categoryName; } ================================================ FILE: newbee-mall-cloud-goods-service/newbee-mall-cloud-goods-web/src/main/java/ltd/goods/cloud/newbee/dao/GoodsCategoryMapper.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.goods.cloud.newbee.dao; import ltd.common.cloud.newbee.dto.PageQueryUtil; import ltd.goods.cloud.newbee.entity.GoodsCategory; import org.apache.ibatis.annotations.Param; import java.util.List; public interface GoodsCategoryMapper { int deleteByPrimaryKey(Long categoryId); int insert(GoodsCategory record); int insertSelective(GoodsCategory record); GoodsCategory selectByPrimaryKey(Long categoryId); GoodsCategory selectByLevelAndName(@Param("categoryLevel") Byte categoryLevel, @Param("categoryName") String categoryName); int updateByPrimaryKeySelective(GoodsCategory record); int updateByPrimaryKey(GoodsCategory record); List findGoodsCategoryList(PageQueryUtil pageUtil); int getTotalGoodsCategories(PageQueryUtil pageUtil); int deleteBatch(Long[] ids); List selectByLevelAndParentIdsAndNumber(@Param("parentIds") List parentIds, @Param("categoryLevel") int categoryLevel, @Param("number") int number); } ================================================ FILE: newbee-mall-cloud-goods-service/newbee-mall-cloud-goods-web/src/main/java/ltd/goods/cloud/newbee/dao/NewBeeMallGoodsMapper.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.goods.cloud.newbee.dao; import ltd.common.cloud.newbee.dto.PageQueryUtil; import ltd.goods.cloud.newbee.entity.NewBeeMallGoods; import ltd.goods.cloud.newbee.entity.StockNumDTO; import org.apache.ibatis.annotations.Param; import java.util.List; public interface NewBeeMallGoodsMapper { int deleteByPrimaryKey(Long goodsId); int insert(NewBeeMallGoods record); int insertSelective(NewBeeMallGoods record); NewBeeMallGoods selectByPrimaryKey(Long goodsId); NewBeeMallGoods selectByCategoryIdAndName(@Param("goodsName") String goodsName, @Param("goodsCategoryId") Long goodsCategoryId); int updateByPrimaryKeySelective(NewBeeMallGoods record); int updateByPrimaryKeyWithBLOBs(NewBeeMallGoods record); int updateByPrimaryKey(NewBeeMallGoods record); List findNewBeeMallGoodsList(PageQueryUtil pageUtil); int getTotalNewBeeMallGoods(PageQueryUtil pageUtil); List selectByPrimaryKeys(List goodsIds); List findNewBeeMallGoodsListBySearch(PageQueryUtil pageUtil); int getTotalNewBeeMallGoodsBySearch(PageQueryUtil pageUtil); int batchInsert(@Param("newBeeMallGoodsList") List newBeeMallGoodsList); int updateStockNum(@Param("stockNumDTOS") List stockNumDTOS); int batchUpdateSellStatus(@Param("orderIds")Long[] orderIds,@Param("sellStatus") int sellStatus); } ================================================ FILE: newbee-mall-cloud-goods-service/newbee-mall-cloud-goods-web/src/main/java/ltd/goods/cloud/newbee/entity/GoodsCategory.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.goods.cloud.newbee.entity; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import java.util.Date; @Data public class GoodsCategory { private Long categoryId; private Byte categoryLevel; private Long parentId; private String categoryName; private Integer categoryRank; private Byte isDeleted; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date createTime; private Integer createUser; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date updateTime; private Integer updateUser; } ================================================ FILE: newbee-mall-cloud-goods-service/newbee-mall-cloud-goods-web/src/main/java/ltd/goods/cloud/newbee/entity/LoginAdminUser.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本系统已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.goods.cloud.newbee.entity; import lombok.Data; @Data public class LoginAdminUser { private Long adminUserId; private String loginUserName; private String loginPassword; private String nickName; private Byte locked; } ================================================ FILE: newbee-mall-cloud-goods-service/newbee-mall-cloud-goods-web/src/main/java/ltd/goods/cloud/newbee/entity/NewBeeMallGoods.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.goods.cloud.newbee.entity; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import java.util.Date; @Data public class NewBeeMallGoods { private Long goodsId; private String goodsName; private String goodsIntro; private Long goodsCategoryId; private String goodsCoverImg; private String goodsCarousel; private Integer originalPrice; private Integer sellingPrice; private Integer stockNum; private String tag; private Byte goodsSellStatus; private Integer createUser; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date createTime; private Integer updateUser; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date updateTime; private String goodsDetailContent; } ================================================ FILE: newbee-mall-cloud-goods-service/newbee-mall-cloud-goods-web/src/main/java/ltd/goods/cloud/newbee/entity/StockNumDTO.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.goods.cloud.newbee.entity; import lombok.Data; /** * 库存修改所需实体 */ @Data public class StockNumDTO { private Long goodsId; private Integer goodsCount; } ================================================ FILE: newbee-mall-cloud-goods-service/newbee-mall-cloud-goods-web/src/main/java/ltd/goods/cloud/newbee/entity/UpdateStockNumDTO.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.goods.cloud.newbee.entity; import lombok.Data; import java.util.List; @Data public class UpdateStockNumDTO { private List stockNumDTOS; public List getStockNumDTOS() { return stockNumDTOS; } public void setStockNumDTOS(List stockNumDTOS) { this.stockNumDTOS = stockNumDTOS; } } ================================================ FILE: newbee-mall-cloud-goods-service/newbee-mall-cloud-goods-web/src/main/java/ltd/goods/cloud/newbee/service/NewBeeMallCategoryService.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.goods.cloud.newbee.service; import ltd.common.cloud.newbee.dto.PageQueryUtil; import ltd.common.cloud.newbee.dto.PageResult; import ltd.goods.cloud.newbee.controller.vo.NewBeeMallIndexCategoryVO; import ltd.goods.cloud.newbee.entity.GoodsCategory; import java.util.List; public interface NewBeeMallCategoryService { String saveCategory(GoodsCategory goodsCategory); String updateGoodsCategory(GoodsCategory goodsCategory); GoodsCategory getGoodsCategoryById(Long id); Boolean deleteBatch(Long[] ids); /** * 后台分页 * * @param pageUtil * @return */ PageResult getCategorisPage(PageQueryUtil pageUtil); /** * 根据parentId和level获取分类列表 * * @param parentIds * @param categoryLevel * @return */ List selectByLevelAndParentIdsAndNumber(List parentIds, int categoryLevel); /** * 返回分类数据(首页调用) * * @return */ List getCategoriesForIndex(); } ================================================ FILE: newbee-mall-cloud-goods-service/newbee-mall-cloud-goods-web/src/main/java/ltd/goods/cloud/newbee/service/NewBeeMallGoodsService.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.goods.cloud.newbee.service; import ltd.common.cloud.newbee.dto.PageQueryUtil; import ltd.common.cloud.newbee.dto.PageResult; import ltd.goods.cloud.newbee.entity.NewBeeMallGoods; import ltd.goods.cloud.newbee.entity.StockNumDTO; import org.apache.ibatis.annotations.Param; import java.util.List; public interface NewBeeMallGoodsService { /** * 后台分页 * * @param pageUtil * @return */ PageResult getNewBeeMallGoodsPage(PageQueryUtil pageUtil); /** * 添加商品 * * @param goods * @return */ String saveNewBeeMallGoods(NewBeeMallGoods goods); /** * 批量新增商品数据 * * @param newBeeMallGoodsList * @return */ void batchSaveNewBeeMallGoods(List newBeeMallGoodsList); /** * 修改商品信息 * * @param goods * @return */ String updateNewBeeMallGoods(NewBeeMallGoods goods); /** * 批量修改销售状态(上架下架) * * @param ids * @return */ Boolean batchUpdateSellStatus(Long[] ids, int sellStatus); /** * 获取商品详情 * * @param id * @return */ NewBeeMallGoods getNewBeeMallGoodsById(Long id); /** * 获取商品数据 * * @param goodsIds * @return */ List getNewBeeMallGoodsByIds(List goodsIds); /** * 商品搜索 * * @param pageUtil * @return */ PageResult searchNewBeeMallGoods(PageQueryUtil pageUtil); Boolean updateStockNum(List stockNumDTOS); } ================================================ FILE: newbee-mall-cloud-goods-service/newbee-mall-cloud-goods-web/src/main/java/ltd/goods/cloud/newbee/service/impl/NewBeeMallCategoryServiceImpl.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.goods.cloud.newbee.service.impl; import ltd.common.cloud.newbee.enums.NewBeeMallCategoryLevelEnum; import ltd.common.cloud.newbee.enums.ServiceResultEnum; import ltd.common.cloud.newbee.dto.PageQueryUtil; import ltd.common.cloud.newbee.dto.PageResult; import ltd.common.cloud.newbee.util.BeanUtil; import ltd.goods.cloud.newbee.controller.vo.NewBeeMallIndexCategoryVO; import ltd.goods.cloud.newbee.controller.vo.SecondLevelCategoryVO; import ltd.goods.cloud.newbee.controller.vo.ThirdLevelCategoryVO; import ltd.goods.cloud.newbee.dao.GoodsCategoryMapper; import ltd.goods.cloud.newbee.entity.GoodsCategory; import ltd.goods.cloud.newbee.service.NewBeeMallCategoryService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.util.*; import java.util.stream.Collectors; import static java.util.stream.Collectors.groupingBy; @Service public class NewBeeMallCategoryServiceImpl implements NewBeeMallCategoryService { @Autowired private GoodsCategoryMapper goodsCategoryMapper; @Override public String saveCategory(GoodsCategory goodsCategory) { GoodsCategory temp = goodsCategoryMapper.selectByLevelAndName(goodsCategory.getCategoryLevel(), goodsCategory.getCategoryName()); if (temp != null) { return ServiceResultEnum.SAME_CATEGORY_EXIST.getResult(); } if (goodsCategoryMapper.insertSelective(goodsCategory) > 0) { return ServiceResultEnum.SUCCESS.getResult(); } return ServiceResultEnum.DB_ERROR.getResult(); } @Override public String updateGoodsCategory(GoodsCategory goodsCategory) { GoodsCategory temp = goodsCategoryMapper.selectByPrimaryKey(goodsCategory.getCategoryId()); if (temp == null) { return ServiceResultEnum.DATA_NOT_EXIST.getResult(); } GoodsCategory temp2 = goodsCategoryMapper.selectByLevelAndName(goodsCategory.getCategoryLevel(), goodsCategory.getCategoryName()); if (temp2 != null && !temp2.getCategoryId().equals(goodsCategory.getCategoryId())) { //同名且不同id 不能继续修改 return ServiceResultEnum.SAME_CATEGORY_EXIST.getResult(); } goodsCategory.setUpdateTime(new Date()); if (goodsCategoryMapper.updateByPrimaryKeySelective(goodsCategory) > 0) { return ServiceResultEnum.SUCCESS.getResult(); } return ServiceResultEnum.DB_ERROR.getResult(); } @Override public GoodsCategory getGoodsCategoryById(Long id) { return goodsCategoryMapper.selectByPrimaryKey(id); } @Override public Boolean deleteBatch(Long[] ids) { if (ids.length < 1) { return false; } //删除分类数据 return goodsCategoryMapper.deleteBatch(ids) > 0; } @Override public PageResult getCategorisPage(PageQueryUtil pageUtil) { List goodsCategories = goodsCategoryMapper.findGoodsCategoryList(pageUtil); int total = goodsCategoryMapper.getTotalGoodsCategories(pageUtil); PageResult pageResult = new PageResult(goodsCategories, total, pageUtil.getLimit(), pageUtil.getPage()); return pageResult; } @Override public List selectByLevelAndParentIdsAndNumber(List parentIds, int categoryLevel) { return goodsCategoryMapper.selectByLevelAndParentIdsAndNumber(parentIds, categoryLevel, 0);//0代表查询所有 } @Override public List getCategoriesForIndex() { List newBeeMallIndexCategoryVOS = new ArrayList<>(); //获取一级分类的固定数量的数据 List firstLevelCategories = goodsCategoryMapper.selectByLevelAndParentIdsAndNumber(Collections.singletonList(0L), NewBeeMallCategoryLevelEnum.LEVEL_ONE.getLevel(), 10); if (!CollectionUtils.isEmpty(firstLevelCategories)) { List firstLevelCategoryIds = firstLevelCategories.stream().map(GoodsCategory::getCategoryId).collect(Collectors.toList()); //获取二级分类的数据 List secondLevelCategories = goodsCategoryMapper.selectByLevelAndParentIdsAndNumber(firstLevelCategoryIds, NewBeeMallCategoryLevelEnum.LEVEL_TWO.getLevel(), 0); if (!CollectionUtils.isEmpty(secondLevelCategories)) { List secondLevelCategoryIds = secondLevelCategories.stream().map(GoodsCategory::getCategoryId).collect(Collectors.toList()); //获取三级分类的数据 List thirdLevelCategories = goodsCategoryMapper.selectByLevelAndParentIdsAndNumber(secondLevelCategoryIds, NewBeeMallCategoryLevelEnum.LEVEL_THREE.getLevel(), 0); if (!CollectionUtils.isEmpty(thirdLevelCategories)) { //根据 parentId 将 thirdLevelCategories 分组 Map> thirdLevelCategoryMap = thirdLevelCategories.stream().collect(groupingBy(GoodsCategory::getParentId)); List secondLevelCategoryVOS = new ArrayList<>(); //处理二级分类 for (GoodsCategory secondLevelCategory : secondLevelCategories) { SecondLevelCategoryVO secondLevelCategoryVO = new SecondLevelCategoryVO(); BeanUtil.copyProperties(secondLevelCategory, secondLevelCategoryVO); //如果该二级分类下有数据则放入 secondLevelCategoryVOS 对象中 if (thirdLevelCategoryMap.containsKey(secondLevelCategory.getCategoryId())) { //根据二级分类的id取出thirdLevelCategoryMap分组中的三级分类list List tempGoodsCategories = thirdLevelCategoryMap.get(secondLevelCategory.getCategoryId()); secondLevelCategoryVO.setThirdLevelCategoryVOS((BeanUtil.copyList(tempGoodsCategories, ThirdLevelCategoryVO.class))); secondLevelCategoryVOS.add(secondLevelCategoryVO); } } //处理一级分类 if (!CollectionUtils.isEmpty(secondLevelCategoryVOS)) { //根据 parentId 将 thirdLevelCategories 分组 Map> secondLevelCategoryVOMap = secondLevelCategoryVOS.stream().collect(groupingBy(SecondLevelCategoryVO::getParentId)); for (GoodsCategory firstCategory : firstLevelCategories) { NewBeeMallIndexCategoryVO newBeeMallIndexCategoryVO = new NewBeeMallIndexCategoryVO(); BeanUtil.copyProperties(firstCategory, newBeeMallIndexCategoryVO); //如果该一级分类下有数据则放入 newBeeMallIndexCategoryVOS 对象中 if (secondLevelCategoryVOMap.containsKey(firstCategory.getCategoryId())) { //根据一级分类的id取出secondLevelCategoryVOMap分组中的二级级分类list List tempGoodsCategories = secondLevelCategoryVOMap.get(firstCategory.getCategoryId()); newBeeMallIndexCategoryVO.setSecondLevelCategoryVOS(tempGoodsCategories); newBeeMallIndexCategoryVOS.add(newBeeMallIndexCategoryVO); } } } } } return newBeeMallIndexCategoryVOS; } else { return null; } } } ================================================ FILE: newbee-mall-cloud-goods-service/newbee-mall-cloud-goods-web/src/main/java/ltd/goods/cloud/newbee/service/impl/NewBeeMallGoodsServiceImpl.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.goods.cloud.newbee.service.impl; import ltd.common.cloud.newbee.enums.NewBeeMallCategoryLevelEnum; import ltd.common.cloud.newbee.enums.ServiceResultEnum; import ltd.common.cloud.newbee.dto.PageQueryUtil; import ltd.common.cloud.newbee.dto.PageResult; import ltd.common.cloud.newbee.exception.NewBeeMallException; import ltd.common.cloud.newbee.util.BeanUtil; import ltd.goods.cloud.newbee.controller.vo.NewBeeMallSearchGoodsVO; import ltd.goods.cloud.newbee.dao.GoodsCategoryMapper; import ltd.goods.cloud.newbee.dao.NewBeeMallGoodsMapper; import ltd.goods.cloud.newbee.entity.GoodsCategory; import ltd.goods.cloud.newbee.entity.NewBeeMallGoods; import ltd.goods.cloud.newbee.entity.StockNumDTO; import ltd.goods.cloud.newbee.service.NewBeeMallGoodsService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.util.ArrayList; import java.util.Date; import java.util.List; @Service public class NewBeeMallGoodsServiceImpl implements NewBeeMallGoodsService { @Autowired private NewBeeMallGoodsMapper goodsMapper; @Autowired private GoodsCategoryMapper goodsCategoryMapper; @Override public PageResult getNewBeeMallGoodsPage(PageQueryUtil pageUtil) { List goodsList = goodsMapper.findNewBeeMallGoodsList(pageUtil); int total = goodsMapper.getTotalNewBeeMallGoods(pageUtil); PageResult pageResult = new PageResult(goodsList, total, pageUtil.getLimit(), pageUtil.getPage()); return pageResult; } @Override public String saveNewBeeMallGoods(NewBeeMallGoods goods) { GoodsCategory goodsCategory = goodsCategoryMapper.selectByPrimaryKey(goods.getGoodsCategoryId()); // 分类不存在或者不是三级分类,则该参数字段异常 if (goodsCategory == null || goodsCategory.getCategoryLevel().intValue() != NewBeeMallCategoryLevelEnum.LEVEL_THREE.getLevel()) { return ServiceResultEnum.GOODS_CATEGORY_ERROR.getResult(); } if (goodsMapper.selectByCategoryIdAndName(goods.getGoodsName(), goods.getGoodsCategoryId()) != null) { return ServiceResultEnum.SAME_GOODS_EXIST.getResult(); } if (goodsMapper.insertSelective(goods) > 0) { return ServiceResultEnum.SUCCESS.getResult(); } return ServiceResultEnum.DB_ERROR.getResult(); } @Override public void batchSaveNewBeeMallGoods(List newBeeMallGoodsList) { if (!CollectionUtils.isEmpty(newBeeMallGoodsList)) { goodsMapper.batchInsert(newBeeMallGoodsList); } } @Override public String updateNewBeeMallGoods(NewBeeMallGoods goods) { GoodsCategory goodsCategory = goodsCategoryMapper.selectByPrimaryKey(goods.getGoodsCategoryId()); // 分类不存在或者不是三级分类,则该参数字段异常 if (goodsCategory == null || goodsCategory.getCategoryLevel().intValue() != NewBeeMallCategoryLevelEnum.LEVEL_THREE.getLevel()) { return ServiceResultEnum.GOODS_CATEGORY_ERROR.getResult(); } NewBeeMallGoods temp = goodsMapper.selectByPrimaryKey(goods.getGoodsId()); if (temp == null) { return ServiceResultEnum.DATA_NOT_EXIST.getResult(); } NewBeeMallGoods temp2 = goodsMapper.selectByCategoryIdAndName(goods.getGoodsName(), goods.getGoodsCategoryId()); if (temp2 != null && !temp2.getGoodsId().equals(goods.getGoodsId())) { //name和分类id相同且不同id 不能继续修改 return ServiceResultEnum.SAME_GOODS_EXIST.getResult(); } goods.setUpdateTime(new Date()); if (goodsMapper.updateByPrimaryKeySelective(goods) > 0) { return ServiceResultEnum.SUCCESS.getResult(); } return ServiceResultEnum.DB_ERROR.getResult(); } @Override public NewBeeMallGoods getNewBeeMallGoodsById(Long id) { NewBeeMallGoods newBeeMallGoods = goodsMapper.selectByPrimaryKey(id); if (newBeeMallGoods == null) { NewBeeMallException.fail(ServiceResultEnum.GOODS_NOT_EXIST.getResult()); } return newBeeMallGoods; } @Override public List getNewBeeMallGoodsByIds(List goodsIds) { return goodsMapper.selectByPrimaryKeys(goodsIds); } @Override public Boolean batchUpdateSellStatus(Long[] ids, int sellStatus) { return goodsMapper.batchUpdateSellStatus(ids, sellStatus) > 0; } @Override public PageResult searchNewBeeMallGoods(PageQueryUtil pageUtil) { List goodsList = goodsMapper.findNewBeeMallGoodsListBySearch(pageUtil); int total = goodsMapper.getTotalNewBeeMallGoodsBySearch(pageUtil); List newBeeMallSearchGoodsVOS = new ArrayList<>(); if (!CollectionUtils.isEmpty(goodsList)) { newBeeMallSearchGoodsVOS = BeanUtil.copyList(goodsList, NewBeeMallSearchGoodsVO.class); for (NewBeeMallSearchGoodsVO newBeeMallSearchGoodsVO : newBeeMallSearchGoodsVOS) { String goodsName = newBeeMallSearchGoodsVO.getGoodsName(); String goodsIntro = newBeeMallSearchGoodsVO.getGoodsIntro(); // 字符串过长导致文字超出的问题 if (goodsName.length() > 28) { goodsName = goodsName.substring(0, 28) + "..."; newBeeMallSearchGoodsVO.setGoodsName(goodsName); } if (goodsIntro.length() > 30) { goodsIntro = goodsIntro.substring(0, 30) + "..."; newBeeMallSearchGoodsVO.setGoodsIntro(goodsIntro); } } } PageResult pageResult = new PageResult(newBeeMallSearchGoodsVOS, total, pageUtil.getLimit(), pageUtil.getPage()); return pageResult; } @Override public Boolean updateStockNum(List stockNumDTOS) { return goodsMapper.updateStockNum(stockNumDTOS) > 0; } } ================================================ FILE: newbee-mall-cloud-goods-service/newbee-mall-cloud-goods-web/src/main/resources/application.properties ================================================ server.port=29010 # 服务名称 spring.application.name=newbee-mall-cloud-goods-service # Nacos地址 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 # Nacos登录用户名(默认为nacos,生产环境一定要修改) spring.cloud.nacos.username=nacos # Nacos登录密码(默认为nacos,生产环境一定要修改) spring.cloud.nacos.password=nacos # datasource config (MySQL) spring.datasource.name=newbee-mall-cloud-goods-datasource spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/newbee_mall_cloud_goods_db?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=utf8&autoReconnect=true&useSSL=false&allowMultiQueries=true spring.datasource.username=root spring.datasource.password=123456 # 指定数据源类型 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource # Druid 数据源设置 # 初始化时建立数据库连接的个数 spring.datasource.initialSize=10 # 最小连接池数量 spring.datasource.minIdle=5 # 最大连接池数量 spring.datasource.maxActive=30 # 配置获取连接等待超时的时间 spring.datasource.maxWait=60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 spring.datasource.timeBetweenEvictionRunsMillis=60000 # 配置一个连接在池中最小生存的时间,单位是毫秒 spring.datasource.minEvictableIdleTimeMillis=300000 # 用来检测连接是否有效的SQL语句 spring.datasource.validationQuery=SELECT 1 spring.datasource.testWhileIdle=true spring.datasource.testOnBorrow=false spring.datasource.testOnReturn=false # mybatis config mybatis.mapper-locations=classpath:mapper/*Mapper.xml # openfeign config feign.client.config.default.connectTimeout=2000 feign.client.config.default.readTimeout=5000 feign.compression.request.enabled=true feign.compression.request.mime-types=text/xml,application/xml,application/json feign.compression.request.min-request-size=1024 feign.compression.response.enabled=true # sentinel config spring.cloud.sentinel.transport.port=8910 spring.cloud.sentinel.transport.clientIp=127.0.0.1 # 指定Sentinel控制台地址 spring.cloud.sentinel.transport.dashboard=127.0.0.1:9113 # 演示需要,开启OpenFeign和当前项目中的DEBUG级别日志 #logging.level.ltd.user.cloud.newbee.openfeign=debug #logging.level.ltd.goods.cloud.newbee=debug # Sleuth采样率,取值范围为[0.1,1.0],值越大收集越及时,但性能影响也越大 spring.sleuth.sampler.probability=1.0 # 每秒数据采集量,最多n条/秒Trace spring.sleuth.sampler.rate=500 spring.zipkin.base-url=http://localhost:9411 seata.enabled=true seata.application-id=goods-server #事务分组配置 seata.tx-service-group=newbee_cloud_save_order_group service.vgroupMapping.newbee_cloud_save_order_group=default #连接Nacos服务中心的配置信息 seata.registry.type=nacos seata.registry.nacos.application=seata-server seata.registry.nacos.server-addr=127.0.0.1:8848 seata.registry.nacos.username=nacos seata.registry.nacos.password=nacos seata.registry.nacos.group=DEFAULT_GROUP seata.registry.nacos.cluster=default ================================================ FILE: newbee-mall-cloud-goods-service/newbee-mall-cloud-goods-web/src/main/resources/logback.xml ================================================ ${APP_NAME} INFO ${CONSOLE_LOG_PATTERN} utf8 192.168.110.57:4560 INFO ================================================ FILE: newbee-mall-cloud-goods-service/newbee-mall-cloud-goods-web/src/main/resources/mapper/GoodsCategoryMapper.xml ================================================ category_id, category_level, parent_id, category_name, category_rank, is_deleted, create_time, create_user, update_time, update_user update tb_newbee_mall_goods_category set is_deleted=1 where category_id = #{categoryId,jdbcType=BIGINT} and is_deleted=0 update tb_newbee_mall_goods_category set is_deleted=1 where category_id in #{id} insert into tb_newbee_mall_goods_category (category_id, category_level, parent_id, category_name, category_rank, is_deleted, create_time, create_user, update_time, update_user) values (#{categoryId,jdbcType=BIGINT}, #{categoryLevel,jdbcType=TINYINT}, #{parentId,jdbcType=BIGINT}, #{categoryName,jdbcType=VARCHAR}, #{categoryRank,jdbcType=INTEGER}, #{isDeleted,jdbcType=TINYINT}, #{createTime,jdbcType=TIMESTAMP}, #{createUser,jdbcType=INTEGER}, #{updateTime,jdbcType=TIMESTAMP}, #{updateUser,jdbcType=INTEGER}) insert into tb_newbee_mall_goods_category category_id, category_level, parent_id, category_name, category_rank, is_deleted, create_time, create_user, update_time, update_user, #{categoryId,jdbcType=BIGINT}, #{categoryLevel,jdbcType=TINYINT}, #{parentId,jdbcType=BIGINT}, #{categoryName,jdbcType=VARCHAR}, #{categoryRank,jdbcType=INTEGER}, #{isDeleted,jdbcType=TINYINT}, #{createTime,jdbcType=TIMESTAMP}, #{createUser,jdbcType=INTEGER}, #{updateTime,jdbcType=TIMESTAMP}, #{updateUser,jdbcType=INTEGER}, update tb_newbee_mall_goods_category category_level = #{categoryLevel,jdbcType=TINYINT}, parent_id = #{parentId,jdbcType=BIGINT}, category_name = #{categoryName,jdbcType=VARCHAR}, category_rank = #{categoryRank,jdbcType=INTEGER}, is_deleted = #{isDeleted,jdbcType=TINYINT}, create_time = #{createTime,jdbcType=TIMESTAMP}, create_user = #{createUser,jdbcType=INTEGER}, update_time = #{updateTime,jdbcType=TIMESTAMP}, update_user = #{updateUser,jdbcType=INTEGER}, where category_id = #{categoryId,jdbcType=BIGINT} update tb_newbee_mall_goods_category set category_level = #{categoryLevel,jdbcType=TINYINT}, parent_id = #{parentId,jdbcType=BIGINT}, category_name = #{categoryName,jdbcType=VARCHAR}, category_rank = #{categoryRank,jdbcType=INTEGER}, is_deleted = #{isDeleted,jdbcType=TINYINT}, create_time = #{createTime,jdbcType=TIMESTAMP}, create_user = #{createUser,jdbcType=INTEGER}, update_time = #{updateTime,jdbcType=TIMESTAMP}, update_user = #{updateUser,jdbcType=INTEGER} where category_id = #{categoryId,jdbcType=BIGINT} ================================================ FILE: newbee-mall-cloud-goods-service/newbee-mall-cloud-goods-web/src/main/resources/mapper/NewBeeMallGoodsMapper.xml ================================================ goods_id, goods_name, goods_intro,goods_category_id, goods_cover_img, goods_carousel, original_price, selling_price, stock_num, tag, goods_sell_status, create_user, create_time, update_user, update_time goods_detail_content INSERT INTO tb_newbee_mall_goods_info(goods_name, goods_intro, goods_category_id,goods_cover_img, goods_carousel, goods_detail_content,original_price, selling_price, stock_num) VALUES (#{goods.goodsName},#{goods.goodsIntro},#{goods.goodsCategoryId},#{goods.goodsCoverImg},#{goods.goodsCarousel},#{goods.goodsDetailContent},#{goods.originalPrice},#{goods.sellingPrice},#{goods.stockNum}) update tb_newbee_mall_goods_info set stock_num = stock_num-#{stockNumDTO.goodsCount} where goods_id = #{stockNumDTO.goodsId} and stock_num>=#{stockNumDTO.goodsCount} and goods_sell_status = 0; update tb_newbee_mall_goods_info set goods_sell_status=#{sellStatus},update_time=now() where goods_id in #{id} delete from tb_newbee_mall_goods_info where goods_id = #{goodsId,jdbcType=BIGINT} insert into tb_newbee_mall_goods_info (goods_id, goods_name, goods_intro, goods_cover_img, goods_carousel, original_price, selling_price, stock_num, tag, goods_sell_status, create_user, create_time, update_user, update_time, goods_detail_content ) values (#{goodsId,jdbcType=BIGINT}, #{goodsName,jdbcType=VARCHAR}, #{goodsIntro,jdbcType=VARCHAR}, #{goodsCoverImg,jdbcType=VARCHAR}, #{goodsCarousel,jdbcType=VARCHAR}, #{originalPrice,jdbcType=INTEGER}, #{sellingPrice,jdbcType=INTEGER}, #{stockNum,jdbcType=INTEGER}, #{tag,jdbcType=VARCHAR}, #{goodsSellStatus,jdbcType=TINYINT}, #{createUser,jdbcType=INTEGER}, #{createTime,jdbcType=TIMESTAMP}, #{updateUser,jdbcType=INTEGER}, #{updateTime,jdbcType=TIMESTAMP}, #{goodsDetailContent,jdbcType=LONGVARCHAR} ) insert into tb_newbee_mall_goods_info goods_id, goods_name, goods_intro, goods_category_id, goods_cover_img, goods_carousel, original_price, selling_price, stock_num, tag, goods_sell_status, create_user, create_time, update_user, update_time, goods_detail_content, #{goodsId,jdbcType=BIGINT}, #{goodsName,jdbcType=VARCHAR}, #{goodsIntro,jdbcType=VARCHAR}, #{goodsCategoryId,jdbcType=BIGINT}, #{goodsCoverImg,jdbcType=VARCHAR}, #{goodsCarousel,jdbcType=VARCHAR}, #{originalPrice,jdbcType=INTEGER}, #{sellingPrice,jdbcType=INTEGER}, #{stockNum,jdbcType=INTEGER}, #{tag,jdbcType=VARCHAR}, #{goodsSellStatus,jdbcType=TINYINT}, #{createUser,jdbcType=INTEGER}, #{createTime,jdbcType=TIMESTAMP}, #{updateUser,jdbcType=INTEGER}, #{updateTime,jdbcType=TIMESTAMP}, #{goodsDetailContent,jdbcType=LONGVARCHAR}, update tb_newbee_mall_goods_info goods_name = #{goodsName,jdbcType=VARCHAR}, goods_intro = #{goodsIntro,jdbcType=VARCHAR}, goods_category_id = #{goodsCategoryId,jdbcType=BIGINT}, goods_cover_img = #{goodsCoverImg,jdbcType=VARCHAR}, goods_carousel = #{goodsCarousel,jdbcType=VARCHAR}, original_price = #{originalPrice,jdbcType=INTEGER}, selling_price = #{sellingPrice,jdbcType=INTEGER}, stock_num = #{stockNum,jdbcType=INTEGER}, tag = #{tag,jdbcType=VARCHAR}, goods_sell_status = #{goodsSellStatus,jdbcType=TINYINT}, create_user = #{createUser,jdbcType=INTEGER}, create_time = #{createTime,jdbcType=TIMESTAMP}, update_user = #{updateUser,jdbcType=INTEGER}, update_time = #{updateTime,jdbcType=TIMESTAMP}, goods_detail_content = #{goodsDetailContent,jdbcType=LONGVARCHAR}, where goods_id = #{goodsId,jdbcType=BIGINT} update tb_newbee_mall_goods_info set goods_name = #{goodsName,jdbcType=VARCHAR}, goods_intro = #{goodsIntro,jdbcType=VARCHAR}, goods_cover_img = #{goodsCoverImg,jdbcType=VARCHAR}, goods_carousel = #{goodsCarousel,jdbcType=VARCHAR}, original_price = #{originalPrice,jdbcType=INTEGER}, selling_price = #{sellingPrice,jdbcType=INTEGER}, stock_num = #{stockNum,jdbcType=INTEGER}, tag = #{tag,jdbcType=VARCHAR}, goods_sell_status = #{goodsSellStatus,jdbcType=TINYINT}, create_user = #{createUser,jdbcType=INTEGER}, create_time = #{createTime,jdbcType=TIMESTAMP}, update_user = #{updateUser,jdbcType=INTEGER}, update_time = #{updateTime,jdbcType=TIMESTAMP}, goods_detail_content = #{goodsDetailContent,jdbcType=LONGVARCHAR} where goods_id = #{goodsId,jdbcType=BIGINT} update tb_newbee_mall_goods_info set goods_name = #{goodsName,jdbcType=VARCHAR}, goods_intro = #{goodsIntro,jdbcType=VARCHAR}, goods_cover_img = #{goodsCoverImg,jdbcType=VARCHAR}, goods_carousel = #{goodsCarousel,jdbcType=VARCHAR}, original_price = #{originalPrice,jdbcType=INTEGER}, selling_price = #{sellingPrice,jdbcType=INTEGER}, stock_num = #{stockNum,jdbcType=INTEGER}, tag = #{tag,jdbcType=VARCHAR}, goods_sell_status = #{goodsSellStatus,jdbcType=TINYINT}, create_user = #{createUser,jdbcType=INTEGER}, create_time = #{createTime,jdbcType=TIMESTAMP}, update_user = #{updateUser,jdbcType=INTEGER}, update_time = #{updateTime,jdbcType=TIMESTAMP} where goods_id = #{goodsId,jdbcType=BIGINT} ================================================ FILE: newbee-mall-cloud-goods-service/pom.xml ================================================ 4.0.0 ltd.newbee.cloud newbee-mall-cloud-goods-service 0.0.1-SNAPSHOT pom newbee-mall-cloud-goods-service 商品模块 ltd.newbee.cloud newbee-mall-cloud 0.0.1-SNAPSHOT 1.8 newbee-mall-cloud-goods-web newbee-mall-cloud-goods-api ================================================ FILE: newbee-mall-cloud-order-service/newbee-mall-cloud-order-api/pom.xml ================================================ 4.0.0 ltd.order.newbee.cloud newbee-mall-cloud-order-api jar 0.0.1-SNAPSHOT newbee-mall-cloud-order-api 订单服务openfeign ltd.newbee.cloud newbee-mall-cloud-order-service 0.0.1-SNAPSHOT 1.8 org.springframework.cloud spring-cloud-starter-openfeign ltd.newbee.cloud newbee-mall-cloud-common 0.0.1-SNAPSHOT ================================================ FILE: newbee-mall-cloud-order-service/newbee-mall-cloud-order-web/pom.xml ================================================ 4.0.0 ltd.order.newbee.cloud newbee-mall-cloud-order-web 0.0.1-SNAPSHOT newbee-mall-cloud-order-web 订单服务 ltd.newbee.cloud newbee-mall-cloud-order-service 0.0.1-SNAPSHOT 1.8 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-test test com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery org.springframework.boot spring-boot-starter-validation org.mybatis.spring.boot mybatis-spring-boot-starter com.alibaba.cloud spring-cloud-starter-alibaba-seata org.projectlombok lombok ${lombok.version} provided io.springfox springfox-boot-starter mysql mysql-connector-java runtime com.alibaba.cloud spring-cloud-starter-alibaba-sentinel org.springframework.cloud spring-cloud-starter-sleuth org.springframework.cloud spring-cloud-sleuth-zipkin ltd.newbee.cloud newbee-mall-cloud-common 0.0.1-SNAPSHOT org.springframework.cloud spring-cloud-starter-openfeign org.springframework.cloud spring-cloud-starter-loadbalancer net.logstash.logback logstash-logback-encoder ${logstash-logback-encoder.version} ltd.user.newbee.cloud newbee-mall-cloud-user-api 0.0.1-SNAPSHOT ltd.goods.newbee.cloud newbee-mall-cloud-goods-api 0.0.1-SNAPSHOT ltd.shopcart.newbee.cloud newbee-mall-cloud-shop-cart-api 0.0.1-SNAPSHOT ================================================ FILE: newbee-mall-cloud-order-service/newbee-mall-cloud-order-web/src/main/java/ltd/order/cloud/newbee/NewBeeMallCloudOrderServiceApplication.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本系统已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.order.cloud.newbee; import ltd.goods.cloud.newbee.openfeign.NewBeeCloudGoodsServiceFeign; import ltd.shopcart.cloud.newbee.openfeign.NewBeeCloudShopCartServiceFeign; import ltd.user.cloud.newbee.openfeign.NewBeeCloudUserServiceFeign; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.openfeign.EnableFeignClients; /** * @author 程序员十三 * @qq交流群 791509631 * @email 2449207463@qq.com * @link https://github.com/newbee-ltd */ @SpringBootApplication @EnableDiscoveryClient @MapperScan("ltd.order.cloud.newbee.dao") @EnableFeignClients(basePackageClasses ={NewBeeCloudUserServiceFeign.class, NewBeeCloudGoodsServiceFeign.class, NewBeeCloudShopCartServiceFeign.class}) public class NewBeeMallCloudOrderServiceApplication { public static void main(String[] args) { System.setProperty("nacos.logging.default.config.enabled","false"); SpringApplication.run(NewBeeMallCloudOrderServiceApplication.class, args); } } ================================================ FILE: newbee-mall-cloud-order-service/newbee-mall-cloud-order-web/src/main/java/ltd/order/cloud/newbee/config/OpenFeignConfiguration.java ================================================ package ltd.order.cloud.newbee.config; import feign.Logger; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class OpenFeignConfiguration { @Bean public Logger.Level openFeignLogLevel() { // 设置OpenFeign日志级别 return Logger.Level.FULL; } } ================================================ FILE: newbee-mall-cloud-order-service/newbee-mall-cloud-order-web/src/main/java/ltd/order/cloud/newbee/config/OrderServiceExceptionHandler.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.order.cloud.newbee.config; import ltd.common.cloud.newbee.enums.ServiceResultEnum; import ltd.common.cloud.newbee.dto.Result; import ltd.common.cloud.newbee.exception.NewBeeMallException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.validation.BindException; import org.springframework.validation.BindingResult; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import javax.servlet.http.HttpServletRequest; import java.util.Objects; /** * 全局异常处理 */ @RestControllerAdvice public class OrderServiceExceptionHandler { private static final Logger log = LoggerFactory.getLogger(OrderServiceExceptionHandler.class); @ExceptionHandler(BindException.class) public Object bindException(BindException e) { log.error("OrderServiceExceptionHandler:",e); Result result = new Result(); result.setResultCode(510); BindingResult bindingResult = e.getBindingResult(); result.setMessage(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage()); return result; } @ExceptionHandler(MethodArgumentNotValidException.class) public Object bindException(MethodArgumentNotValidException e) { log.error("OrderServiceExceptionHandler:",e); Result result = new Result(); result.setResultCode(510); BindingResult bindingResult = e.getBindingResult(); result.setMessage(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage()); return result; } @ExceptionHandler(Exception.class) public Object handleException(Exception e, HttpServletRequest req) { log.error("OrderServiceExceptionHandler:",e); Result result = new Result(); result.setResultCode(500); //区分是否为自定义异常 if (e instanceof NewBeeMallException) { result.setMessage(e.getMessage()); if (e.getMessage().equals(ServiceResultEnum.ADMIN_NOT_LOGIN_ERROR.getResult()) || e.getMessage().equals(ServiceResultEnum.ADMIN_TOKEN_EXPIRE_ERROR.getResult())) { result.setResultCode(419); } if (e.getMessage().equals(ServiceResultEnum.NOT_LOGIN_ERROR.getResult()) || e.getMessage().equals(ServiceResultEnum.TOKEN_EXPIRE_ERROR.getResult())) { result.setResultCode(416); } } else { e.printStackTrace(); result.setMessage("未知异常,请查看控制台日志并检查配置文件。"); } return result; } } ================================================ FILE: newbee-mall-cloud-order-service/newbee-mall-cloud-order-web/src/main/java/ltd/order/cloud/newbee/config/OrderServiceSwagger3Config.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.order.cloud.newbee.config; import ltd.common.cloud.newbee.pojo.MallUserToken; import ltd.order.cloud.newbee.entity.LoginAdminUser; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.builders.RequestParameterBuilder; import springfox.documentation.oas.annotations.EnableOpenApi; import springfox.documentation.schema.ScalarType; import springfox.documentation.service.ApiInfo; import springfox.documentation.service.ParameterType; import springfox.documentation.service.RequestParameter; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket; import java.util.ArrayList; import java.util.List; @Configuration @EnableOpenApi public class OrderServiceSwagger3Config { @Bean public Docket api() { return new Docket(DocumentationType.OAS_30) .apiInfo(apiInfo()) .ignoredParameterTypes(LoginAdminUser.class, MallUserToken.class) .select() .apis(RequestHandlerSelectors.basePackage("ltd.order.cloud.newbee.controller")) .paths(PathSelectors.any()) .build() .globalRequestParameters(getGlobalRequestParameters()); } //生成全局通用参数 private List getGlobalRequestParameters() { List parameters = new ArrayList<>(); parameters.add(new RequestParameterBuilder() .name("token") .description("登录认证token") .required(false) // 非必传 .in(ParameterType.HEADER) //请求头中的参数,其它类型可以点进ParameterType类中查看 .query(q -> q.model(m -> m.scalarModel(ScalarType.STRING))) .build()); return parameters; } private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("newbee-mall-cloud-order-service接口文档") .description("swagger接口文档") .version("2.0") .build(); } } ================================================ FILE: newbee-mall-cloud-order-service/newbee-mall-cloud-order-web/src/main/java/ltd/order/cloud/newbee/config/OrderServiceWebMvcConfigurer.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.order.cloud.newbee.config; import com.alibaba.cloud.sentinel.SentinelProperties; import com.alibaba.csp.sentinel.adapter.spring.webmvc.SentinelWebInterceptor; import ltd.order.cloud.newbee.config.handler.TokenToAdminUserMethodArgumentResolver; import ltd.order.cloud.newbee.config.handler.TokenToMallUserMethodArgumentResolver; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Lazy; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; import java.util.List; import java.util.Optional; @Configuration public class OrderServiceWebMvcConfigurer extends WebMvcConfigurationSupport { private static final Logger log = LoggerFactory.getLogger(OrderServiceWebMvcConfigurer.class); @Autowired private SentinelProperties sentinelProperties; @Autowired private Optional sentinelWebInterceptorOptional; @Autowired @Lazy private TokenToAdminUserMethodArgumentResolver tokenToAdminUserMethodArgumentResolver; @Autowired @Lazy private TokenToMallUserMethodArgumentResolver tokenToMallUserMethodArgumentResolver; /** * @param argumentResolvers * @tip @TokenToAdminUser 注解处理方法 */ public void addArgumentResolvers(List argumentResolvers) { argumentResolvers.add(tokenToAdminUserMethodArgumentResolver); argumentResolvers.add(tokenToMallUserMethodArgumentResolver); } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry. addResourceHandler("/swagger-ui/**") .addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/") .resourceChain(false); } public void addInterceptors(InterceptorRegistry registry) { if (this.sentinelWebInterceptorOptional.isPresent()) { SentinelProperties.Filter filterConfig = this.sentinelProperties.getFilter(); registry.addInterceptor((HandlerInterceptor) this.sentinelWebInterceptorOptional.get()).order(filterConfig.getOrder()).addPathPatterns(filterConfig.getUrlPatterns()); log.info("[Sentinel Starter] register SentinelWebInterceptor with urlPatterns: {}.", filterConfig.getUrlPatterns()); } } } ================================================ FILE: newbee-mall-cloud-order-service/newbee-mall-cloud-order-web/src/main/java/ltd/order/cloud/newbee/config/SeataProxyConfiguration.java ================================================ package ltd.order.cloud.newbee.config; import com.alibaba.druid.pool.DruidDataSource; import io.seata.rm.datasource.DataSourceProxy; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import javax.annotation.PostConstruct; import javax.sql.DataSource; @Configuration public class SeataProxyConfiguration { //创建Druid数据源 @Bean @ConfigurationProperties(prefix = "spring.datasource") public DruidDataSource druidDataSource() { return new DruidDataSource(); } //创建DataSource数据源代理 @Bean("dataSource") @Primary public DataSource dataSourceDelegation(DruidDataSource druidDataSource) { return new DataSourceProxy(druidDataSource); } /* * 解决druid 日志报错:discard long time none received connection:xxx * */ @PostConstruct public void setProperties(){ System.setProperty("druid.mysql.usePingMethod","false"); } } ================================================ FILE: newbee-mall-cloud-order-service/newbee-mall-cloud-order-web/src/main/java/ltd/order/cloud/newbee/config/annotation/TokenToAdminUser.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.order.cloud.newbee.config.annotation; import java.lang.annotation.*; @Target({ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface TokenToAdminUser { /** * 当前用户在request中的名字 * * @return */ String value() default "adminUser"; } ================================================ FILE: newbee-mall-cloud-order-service/newbee-mall-cloud-order-web/src/main/java/ltd/order/cloud/newbee/config/annotation/TokenToMallUser.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.order.cloud.newbee.config.annotation; import java.lang.annotation.*; @Target({ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface TokenToMallUser { /** * 当前用户在request中的名字 * * @return */ String value() default "user"; } ================================================ FILE: newbee-mall-cloud-order-service/newbee-mall-cloud-order-web/src/main/java/ltd/order/cloud/newbee/config/handler/TokenToAdminUserMethodArgumentResolver.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.order.cloud.newbee.config.handler; import ltd.common.cloud.newbee.enums.ServiceResultEnum; import ltd.common.cloud.newbee.dto.Result; import ltd.common.cloud.newbee.exception.NewBeeMallException; import ltd.order.cloud.newbee.config.annotation.TokenToAdminUser; import ltd.order.cloud.newbee.entity.LoginAdminUser; import ltd.user.cloud.newbee.openfeign.NewBeeCloudUserServiceFeign; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.MethodParameter; import org.springframework.stereotype.Component; import org.springframework.web.bind.support.WebDataBinderFactory; import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.method.support.ModelAndViewContainer; import java.util.LinkedHashMap; @Component public class TokenToAdminUserMethodArgumentResolver implements HandlerMethodArgumentResolver { @Autowired private NewBeeCloudUserServiceFeign newBeeCloudUserService; public TokenToAdminUserMethodArgumentResolver() { } public boolean supportsParameter(MethodParameter parameter) { if (parameter.hasParameterAnnotation(TokenToAdminUser.class)) { return true; } return false; } public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) { if (parameter.getParameterAnnotation(TokenToAdminUser.class) instanceof TokenToAdminUser) { String token = webRequest.getHeader("token"); if (null != token && !"".equals(token) && token.length() == 32) { // 通过用户中心获取用户信息 Result result = newBeeCloudUserService.getAdminUserByToken(token); if (result == null || result.getResultCode() != 200 || result.getData() == null) { NewBeeMallException.fail(ServiceResultEnum.ADMIN_NOT_LOGIN_ERROR.getResult()); } LinkedHashMap resultData = (LinkedHashMap) result.getData(); // 将返回的字段封装到LoginAdminUser对象中 LoginAdminUser loginAdminUser = new LoginAdminUser(); loginAdminUser.setAdminUserId(Long.valueOf(resultData.get("adminUserId").toString())); loginAdminUser.setLoginUserName((String) resultData.get("loginUserName")); loginAdminUser.setNickName((String) resultData.get("nickName")); loginAdminUser.setLocked(Byte.valueOf(resultData.get("locked").toString())); return loginAdminUser; } else { NewBeeMallException.fail(ServiceResultEnum.ADMIN_NOT_LOGIN_ERROR.getResult()); } } return null; } } ================================================ FILE: newbee-mall-cloud-order-service/newbee-mall-cloud-order-web/src/main/java/ltd/order/cloud/newbee/config/handler/TokenToMallUserMethodArgumentResolver.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.order.cloud.newbee.config.handler; import ltd.common.cloud.newbee.enums.ServiceResultEnum; import ltd.common.cloud.newbee.dto.Result; import ltd.common.cloud.newbee.exception.NewBeeMallException; import ltd.common.cloud.newbee.pojo.MallUserToken; import ltd.order.cloud.newbee.config.annotation.TokenToMallUser; import ltd.user.cloud.newbee.dto.MallUserDTO; import ltd.user.cloud.newbee.openfeign.NewBeeCloudUserServiceFeign; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.MethodParameter; import org.springframework.stereotype.Component; import org.springframework.web.bind.support.WebDataBinderFactory; import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.method.support.ModelAndViewContainer; @Component public class TokenToMallUserMethodArgumentResolver implements HandlerMethodArgumentResolver { @Autowired private NewBeeCloudUserServiceFeign newBeeCloudUserService; public TokenToMallUserMethodArgumentResolver() { } public boolean supportsParameter(MethodParameter parameter) { if (parameter.hasParameterAnnotation(TokenToMallUser.class)) { return true; } return false; } public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) { if (parameter.getParameterAnnotation(TokenToMallUser.class) instanceof TokenToMallUser) { String token = webRequest.getHeader("token"); if (null != token && !"".equals(token) && token.length() == 32) { Result result = newBeeCloudUserService.getMallUserByToken(token); if (result == null || result.getResultCode() != 200 || result.getData() == null) { NewBeeMallException.fail(ServiceResultEnum.TOKEN_EXPIRE_ERROR.getResult()); } MallUserToken mallUserToken = new MallUserToken(); mallUserToken.setToken(token); mallUserToken.setUserId(result.getData().getUserId()); return mallUserToken; } else { NewBeeMallException.fail(ServiceResultEnum.NOT_LOGIN_ERROR.getResult()); } } return null; } } ================================================ FILE: newbee-mall-cloud-order-service/newbee-mall-cloud-order-web/src/main/java/ltd/order/cloud/newbee/controller/NewBeeAdminOrderController.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本系统已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.order.cloud.newbee.controller; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import ltd.common.cloud.newbee.dto.PageQueryUtil; import ltd.common.cloud.newbee.dto.Result; import ltd.common.cloud.newbee.dto.ResultGenerator; import ltd.common.cloud.newbee.enums.ServiceResultEnum; import ltd.order.cloud.newbee.config.annotation.TokenToAdminUser; import ltd.order.cloud.newbee.controller.param.BatchIdParam; import ltd.order.cloud.newbee.controller.vo.NewBeeMallOrderDetailVO; import ltd.order.cloud.newbee.entity.LoginAdminUser; import ltd.order.cloud.newbee.service.NewBeeMallOrderService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.HashMap; import java.util.Map; /** * @author 13 * @qq交流群 796794009 * @email 2449207463@qq.com * @link https://github.com/newbee-ltd */ @RestController @Api(value = "v1", tags = "后台管理系统订单模块接口") @RequestMapping("/orders/admin") public class NewBeeAdminOrderController { private static final Logger logger = LoggerFactory.getLogger(NewBeeAdminOrderController.class); @Resource private NewBeeMallOrderService newBeeMallOrderService; /** * 列表 */ @RequestMapping(value = "/list", method = RequestMethod.GET) @ApiOperation(value = "订单列表", notes = "可根据订单号和订单状态筛选") public Result list(@RequestParam(required = false) @ApiParam(value = "页码") Integer pageNumber, @RequestParam(required = false) @ApiParam(value = "每页条数") Integer pageSize, @RequestParam(required = false) @ApiParam(value = "订单号") String orderNo, @RequestParam(required = false) @ApiParam(value = "订单状态") Integer orderStatus, @TokenToAdminUser LoginAdminUser adminUser) { logger.info("adminUser:{}", adminUser.toString()); if (pageNumber == null || pageNumber < 1 || pageSize == null || pageSize < 10) { return ResultGenerator.genFailResult("分页参数异常!"); } Map params = new HashMap(8); params.put("page", pageNumber); params.put("limit", pageSize); if (StringUtils.hasText(orderNo)) { params.put("orderNo", orderNo); } if (orderStatus != null) { params.put("orderStatus", orderStatus); } PageQueryUtil pageUtil = new PageQueryUtil(params); return ResultGenerator.genSuccessResult(newBeeMallOrderService.getNewBeeMallOrdersPage(pageUtil)); } @GetMapping("/detail/{orderId}") @ApiOperation(value = "订单详情接口", notes = "传参为订单号") public Result orderDetailPage(@ApiParam(value = "订单号") @PathVariable("orderId") Long orderId, @TokenToAdminUser LoginAdminUser adminUser) { logger.info("adminUser:{}", adminUser.toString()); return ResultGenerator.genSuccessResult(newBeeMallOrderService.getOrderDetailByOrderId(orderId)); } /** * 配货 */ @RequestMapping(value = "/checkDone", method = RequestMethod.PUT) @ApiOperation(value = "修改订单状态为配货成功", notes = "批量修改") public Result checkDone(@RequestBody BatchIdParam batchIdParam, @TokenToAdminUser LoginAdminUser adminUser) { logger.info("adminUser:{}", adminUser.toString()); if (batchIdParam==null||batchIdParam.getIds().length < 1) { return ResultGenerator.genFailResult("参数异常!"); } String result = newBeeMallOrderService.checkDone(batchIdParam.getIds()); if (ServiceResultEnum.SUCCESS.getResult().equals(result)) { return ResultGenerator.genSuccessResult(); } else { return ResultGenerator.genFailResult(result); } } /** * 出库 */ @RequestMapping(value = "/checkOut", method = RequestMethod.PUT) @ApiOperation(value = "修改订单状态为已出库", notes = "批量修改") public Result checkOut(@RequestBody BatchIdParam batchIdParam, @TokenToAdminUser LoginAdminUser adminUser) { logger.info("adminUser:{}", adminUser.toString()); if (batchIdParam==null||batchIdParam.getIds().length < 1) { return ResultGenerator.genFailResult("参数异常!"); } String result = newBeeMallOrderService.checkOut(batchIdParam.getIds()); if (ServiceResultEnum.SUCCESS.getResult().equals(result)) { return ResultGenerator.genSuccessResult(); } else { return ResultGenerator.genFailResult(result); } } /** * 关闭订单 */ @RequestMapping(value = "/close", method = RequestMethod.PUT) @ApiOperation(value = "修改订单状态为商家关闭", notes = "批量修改") public Result closeOrder(@RequestBody BatchIdParam batchIdParam, @TokenToAdminUser LoginAdminUser adminUser) { logger.info("adminUser:{}", adminUser.toString()); if (batchIdParam==null||batchIdParam.getIds().length < 1) { return ResultGenerator.genFailResult("参数异常!"); } String result = newBeeMallOrderService.closeOrder(batchIdParam.getIds()); if (ServiceResultEnum.SUCCESS.getResult().equals(result)) { return ResultGenerator.genSuccessResult(); } else { return ResultGenerator.genFailResult(result); } } } ================================================ FILE: newbee-mall-cloud-order-service/newbee-mall-cloud-order-web/src/main/java/ltd/order/cloud/newbee/controller/NewBeeMallOrderController.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.order.cloud.newbee.controller; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import ltd.common.cloud.newbee.enums.ServiceResultEnum; import ltd.common.cloud.newbee.dto.PageQueryUtil; import ltd.common.cloud.newbee.dto.PageResult; import ltd.common.cloud.newbee.dto.Result; import ltd.common.cloud.newbee.dto.ResultGenerator; import ltd.common.cloud.newbee.exception.NewBeeMallException; import ltd.common.cloud.newbee.pojo.MallUserToken; import ltd.order.cloud.newbee.config.annotation.TokenToMallUser; import ltd.order.cloud.newbee.controller.param.SaveOrderParam; import ltd.order.cloud.newbee.controller.vo.NewBeeMallOrderDetailVO; import ltd.order.cloud.newbee.controller.vo.NewBeeMallOrderListVO; import ltd.order.cloud.newbee.entity.MallUserAddress; import ltd.order.cloud.newbee.service.NewBeeMallOrderService; import ltd.order.cloud.newbee.service.NewBeeMallUserAddressService; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @RestController @Api(value = "v1", tags = "新蜂商城订单操作相关接口") @RequestMapping("/orders/mall") public class NewBeeMallOrderController { @Resource private NewBeeMallOrderService newBeeMallOrderService; @Resource private NewBeeMallUserAddressService newBeeMallUserAddressService; @PostMapping("/saveOrder") @ApiOperation(value = "生成订单接口", notes = "传参为地址id和待结算的购物项id数组") public Result saveOrder(@ApiParam(value = "订单参数") @RequestBody SaveOrderParam saveOrderParam, @TokenToMallUser MallUserToken loginMallUserToken) { if (saveOrderParam == null || saveOrderParam.getCartItemIds() == null || saveOrderParam.getAddressId() == null) { NewBeeMallException.fail(ServiceResultEnum.PARAM_ERROR.getResult()); } if (saveOrderParam.getCartItemIds().length < 1) { NewBeeMallException.fail(ServiceResultEnum.PARAM_ERROR.getResult()); } MallUserAddress address = newBeeMallUserAddressService.getMallUserAddressById(saveOrderParam.getAddressId()); if (!loginMallUserToken.getUserId().equals(address.getUserId())) { return ResultGenerator.genFailResult(ServiceResultEnum.REQUEST_FORBIDEN_ERROR.getResult()); } //保存订单并返回订单号 String saveOrderResult = newBeeMallOrderService.saveOrder(loginMallUserToken.getUserId(), address, Arrays.asList(saveOrderParam.getCartItemIds())); Result result = ResultGenerator.genSuccessResult(); result.setData(saveOrderResult); return result; } @GetMapping("/order/{orderNo}") @ApiOperation(value = "订单详情接口", notes = "传参为订单号") public Result orderDetailPage(@ApiParam(value = "订单号") @PathVariable("orderNo") String orderNo, @TokenToMallUser MallUserToken loginMallUserToken) { return ResultGenerator.genSuccessResult(newBeeMallOrderService.getOrderDetailByOrderNo(orderNo, loginMallUserToken.getUserId())); } @GetMapping("/order") @ApiOperation(value = "订单列表接口", notes = "传参为页码") public Result>> orderList(@ApiParam(value = "页码") @RequestParam(required = false) Integer pageNumber, @ApiParam(value = "订单状态:0.待支付 1.待确认 2.待发货 3:已发货 4.交易成功") @RequestParam(required = false) Integer status, @TokenToMallUser MallUserToken loginMallUserToken) { Map params = new HashMap(8); if (pageNumber == null || pageNumber < 1) { pageNumber = 1; } params.put("userId", loginMallUserToken.getUserId()); params.put("orderStatus", status); params.put("page", pageNumber); params.put("limit", 5); //封装分页请求参数 PageQueryUtil pageUtil = new PageQueryUtil(params); return ResultGenerator.genSuccessResult(newBeeMallOrderService.getMyOrders(pageUtil)); } @PutMapping("/order/{orderNo}/cancel") @ApiOperation(value = "订单取消接口", notes = "传参为订单号") public Result cancelOrder(@ApiParam(value = "订单号") @PathVariable("orderNo") String orderNo, @TokenToMallUser MallUserToken loginMallUserToken) { String cancelOrderResult = newBeeMallOrderService.cancelOrder(orderNo, loginMallUserToken.getUserId()); if (ServiceResultEnum.SUCCESS.getResult().equals(cancelOrderResult)) { return ResultGenerator.genSuccessResult(); } else { return ResultGenerator.genFailResult(cancelOrderResult); } } @PutMapping("/order/{orderNo}/finish") @ApiOperation(value = "确认收货接口", notes = "传参为订单号") public Result finishOrder(@ApiParam(value = "订单号") @PathVariable("orderNo") String orderNo, @TokenToMallUser MallUserToken loginMallUserToken) { String finishOrderResult = newBeeMallOrderService.finishOrder(orderNo, loginMallUserToken.getUserId()); if (ServiceResultEnum.SUCCESS.getResult().equals(finishOrderResult)) { return ResultGenerator.genSuccessResult(); } else { return ResultGenerator.genFailResult(finishOrderResult); } } @GetMapping("/paySuccess") @ApiOperation(value = "模拟支付成功回调的接口", notes = "传参为订单号和支付方式") public Result paySuccess(@ApiParam(value = "订单号") @RequestParam("orderNo") String orderNo, @ApiParam(value = "支付方式") @RequestParam("payType") int payType) { String payResult = newBeeMallOrderService.paySuccess(orderNo, payType); if (ServiceResultEnum.SUCCESS.getResult().equals(payResult)) { return ResultGenerator.genSuccessResult(); } else { return ResultGenerator.genFailResult(payResult); } } } ================================================ FILE: newbee-mall-cloud-order-service/newbee-mall-cloud-order-web/src/main/java/ltd/order/cloud/newbee/controller/NewBeeMallUserAddressController.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.order.cloud.newbee.controller; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import ltd.common.cloud.newbee.enums.ServiceResultEnum; import ltd.common.cloud.newbee.dto.Result; import ltd.common.cloud.newbee.dto.ResultGenerator; import ltd.common.cloud.newbee.pojo.MallUserToken; import ltd.common.cloud.newbee.util.BeanUtil; import ltd.order.cloud.newbee.config.annotation.TokenToMallUser; import ltd.order.cloud.newbee.controller.param.SaveMallUserAddressParam; import ltd.order.cloud.newbee.controller.param.UpdateMallUserAddressParam; import ltd.order.cloud.newbee.controller.vo.NewBeeMallUserAddressVO; import ltd.order.cloud.newbee.entity.MallUserAddress; import ltd.order.cloud.newbee.service.NewBeeMallUserAddressService; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.List; @RestController @Api(value = "v1", tags = "新蜂商城个人地址相关接口") @RequestMapping("/mall") public class NewBeeMallUserAddressController { @Resource private NewBeeMallUserAddressService mallUserAddressService; @GetMapping("/address") @ApiOperation(value = "我的收货地址列表", notes = "") public Result> addressList(@TokenToMallUser MallUserToken loginMallUserToken) { return ResultGenerator.genSuccessResult(mallUserAddressService.getMyAddresses(loginMallUserToken.getUserId())); } @PostMapping("/address") @ApiOperation(value = "添加地址", notes = "") public Result saveUserAddress(@RequestBody SaveMallUserAddressParam saveMallUserAddressParam, @TokenToMallUser MallUserToken loginMallUserToken) { MallUserAddress userAddress = new MallUserAddress(); BeanUtil.copyProperties(saveMallUserAddressParam, userAddress); userAddress.setUserId(loginMallUserToken.getUserId()); Boolean saveResult = mallUserAddressService.saveUserAddress(userAddress); //添加成功 if (saveResult) { return ResultGenerator.genSuccessResult(); } //添加失败 return ResultGenerator.genFailResult("添加失败"); } @PutMapping("/address") @ApiOperation(value = "修改地址", notes = "") public Result updateMallUserAddress(@RequestBody UpdateMallUserAddressParam updateMallUserAddressParam, @TokenToMallUser MallUserToken loginMallUserToken) { MallUserAddress mallUserAddressById = mallUserAddressService.getMallUserAddressById(updateMallUserAddressParam.getAddressId()); if (!loginMallUserToken.getUserId().equals(mallUserAddressById.getUserId())) { return ResultGenerator.genFailResult(ServiceResultEnum.REQUEST_FORBIDEN_ERROR.getResult()); } MallUserAddress userAddress = new MallUserAddress(); BeanUtil.copyProperties(updateMallUserAddressParam, userAddress); userAddress.setUserId(loginMallUserToken.getUserId()); Boolean updateResult = mallUserAddressService.updateMallUserAddress(userAddress); //修改成功 if (updateResult) { return ResultGenerator.genSuccessResult(); } //修改失败 return ResultGenerator.genFailResult("修改失败"); } @GetMapping("/address/{addressId}") @ApiOperation(value = "获取收货地址详情", notes = "传参为地址id") public Result getMallUserAddress(@PathVariable("addressId") Long addressId, @TokenToMallUser MallUserToken loginMallUserToken) { MallUserAddress mallUserAddressById = mallUserAddressService.getMallUserAddressById(addressId); NewBeeMallUserAddressVO newBeeMallUserAddressVO = new NewBeeMallUserAddressVO(); BeanUtil.copyProperties(mallUserAddressById, newBeeMallUserAddressVO); if (!loginMallUserToken.getUserId().equals(mallUserAddressById.getUserId())) { return ResultGenerator.genFailResult(ServiceResultEnum.REQUEST_FORBIDEN_ERROR.getResult()); } return ResultGenerator.genSuccessResult(newBeeMallUserAddressVO); } @GetMapping("/address/default") @ApiOperation(value = "获取默认收货地址", notes = "无传参") public Result getDefaultMallUserAddress(@TokenToMallUser MallUserToken loginMallUserToken) { MallUserAddress mallUserAddressById = mallUserAddressService.getMyDefaultAddressByUserId(loginMallUserToken.getUserId()); return ResultGenerator.genSuccessResult(mallUserAddressById); } @DeleteMapping("/address/{addressId}") @ApiOperation(value = "删除收货地址", notes = "传参为地址id") public Result deleteAddress(@PathVariable("addressId") Long addressId, @TokenToMallUser MallUserToken loginMallUserToken) { MallUserAddress mallUserAddressById = mallUserAddressService.getMallUserAddressById(addressId); if (!loginMallUserToken.getUserId().equals(mallUserAddressById.getUserId())) { return ResultGenerator.genFailResult(ServiceResultEnum.REQUEST_FORBIDEN_ERROR.getResult()); } Boolean deleteResult = mallUserAddressService.deleteById(addressId); //删除成功 if (deleteResult) { return ResultGenerator.genSuccessResult(); } //删除失败 return ResultGenerator.genFailResult(ServiceResultEnum.OPERATE_ERROR.getResult()); } } ================================================ FILE: newbee-mall-cloud-order-service/newbee-mall-cloud-order-web/src/main/java/ltd/order/cloud/newbee/controller/param/BatchIdParam.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.order.cloud.newbee.controller.param; import lombok.Data; import java.io.Serializable; @Data public class BatchIdParam implements Serializable { //id数组 Long[] ids; } ================================================ FILE: newbee-mall-cloud-order-service/newbee-mall-cloud-order-web/src/main/java/ltd/order/cloud/newbee/controller/param/SaveMallUserAddressParam.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.order.cloud.newbee.controller.param; import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** * 添加收货地址param */ @Data public class SaveMallUserAddressParam { @ApiModelProperty("收件人名称") private String userName; @ApiModelProperty("收件人联系方式") private String userPhone; @ApiModelProperty("是否默认地址 0-不是 1-是") private Byte defaultFlag; @ApiModelProperty("省") private String provinceName; @ApiModelProperty("市") private String cityName; @ApiModelProperty("区/县") private String regionName; @ApiModelProperty("详细地址") private String detailAddress; } ================================================ FILE: newbee-mall-cloud-order-service/newbee-mall-cloud-order-web/src/main/java/ltd/order/cloud/newbee/controller/param/SaveOrderParam.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.order.cloud.newbee.controller.param; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; /** * 保存订单param */ @Data public class SaveOrderParam implements Serializable { @ApiModelProperty("订单项id数组") private Long[] cartItemIds; @ApiModelProperty("地址id") private Long addressId; } ================================================ FILE: newbee-mall-cloud-order-service/newbee-mall-cloud-order-web/src/main/java/ltd/order/cloud/newbee/controller/param/UpdateMallUserAddressParam.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.order.cloud.newbee.controller.param; import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** * 修改收货地址param */ @Data public class UpdateMallUserAddressParam { @ApiModelProperty("地址id") private Long addressId; @ApiModelProperty("用户id") private Long userId; @ApiModelProperty("收件人名称") private String userName; @ApiModelProperty("收件人联系方式") private String userPhone; @ApiModelProperty("是否默认地址 0-不是 1-是") private Byte defaultFlag; @ApiModelProperty("省") private String provinceName; @ApiModelProperty("市") private String cityName; @ApiModelProperty("区/县") private String regionName; @ApiModelProperty("详细地址") private String detailAddress; } ================================================ FILE: newbee-mall-cloud-order-service/newbee-mall-cloud-order-web/src/main/java/ltd/order/cloud/newbee/controller/vo/NewBeeMallOrderDetailVO.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.order.cloud.newbee.controller.vo; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; import java.util.Date; import java.util.List; /** * 订单详情页页面VO */ @Data public class NewBeeMallOrderDetailVO implements Serializable { @ApiModelProperty("订单号") private String orderNo; @ApiModelProperty("订单价格") private Integer totalPrice; @ApiModelProperty("订单支付状态码") private Byte payStatus; @ApiModelProperty("订单支付方式") private Byte payType; @ApiModelProperty("订单支付方式") private String payTypeString; @ApiModelProperty("订单支付时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date payTime; @ApiModelProperty("订单状态码") private Byte orderStatus; @ApiModelProperty("订单状态") private String orderStatusString; @ApiModelProperty("创建时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date createTime; @ApiModelProperty("订单项列表") private List newBeeMallOrderItemVOS; } ================================================ FILE: newbee-mall-cloud-order-service/newbee-mall-cloud-order-web/src/main/java/ltd/order/cloud/newbee/controller/vo/NewBeeMallOrderItemVO.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.order.cloud.newbee.controller.vo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; /** * 订单详情页页面订单项VO */ @Data public class NewBeeMallOrderItemVO implements Serializable { @ApiModelProperty("商品id") private Long goodsId; @ApiModelProperty("商品数量") private Integer goodsCount; @ApiModelProperty("商品名称") private String goodsName; @ApiModelProperty("商品图片") private String goodsCoverImg; @ApiModelProperty("商品价格") private Integer sellingPrice; } ================================================ FILE: newbee-mall-cloud-order-service/newbee-mall-cloud-order-web/src/main/java/ltd/order/cloud/newbee/controller/vo/NewBeeMallOrderListVO.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.order.cloud.newbee.controller.vo; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; import java.util.Date; import java.util.List; /** * 订单列表页面VO */ @Data public class NewBeeMallOrderListVO implements Serializable { private Long orderId; @ApiModelProperty("订单号") private String orderNo; @ApiModelProperty("订单价格") private Integer totalPrice; @ApiModelProperty("订单支付方式") private Byte payType; @ApiModelProperty("订单状态码") private Byte orderStatus; @ApiModelProperty("订单状态") private String orderStatusString; @ApiModelProperty("创建时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date createTime; @ApiModelProperty("订单项列表") private List newBeeMallOrderItemVOS; } ================================================ FILE: newbee-mall-cloud-order-service/newbee-mall-cloud-order-web/src/main/java/ltd/order/cloud/newbee/controller/vo/NewBeeMallUserAddressVO.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.order.cloud.newbee.controller.vo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** * 收货地址VO */ @Data public class NewBeeMallUserAddressVO { @ApiModelProperty("地址id") private Long addressId; @ApiModelProperty("用户id") private Long userId; @ApiModelProperty("收件人名称") private String userName; @ApiModelProperty("收件人联系方式") private String userPhone; @ApiModelProperty("是否默认地址 0-不是 1-是") private Byte defaultFlag; @ApiModelProperty("省") private String provinceName; @ApiModelProperty("市") private String cityName; @ApiModelProperty("区/县") private String regionName; @ApiModelProperty("详细地址") private String detailAddress; } ================================================ FILE: newbee-mall-cloud-order-service/newbee-mall-cloud-order-web/src/main/java/ltd/order/cloud/newbee/dao/MallUserAddressMapper.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.order.cloud.newbee.dao; import ltd.order.cloud.newbee.entity.MallUserAddress; import java.util.List; public interface MallUserAddressMapper { int deleteByPrimaryKey(Long addressId); int insert(MallUserAddress record); int insertSelective(MallUserAddress record); MallUserAddress selectByPrimaryKey(Long addressId); MallUserAddress getMyDefaultAddress(Long userId); List findMyAddressList(Long userId); int updateByPrimaryKeySelective(MallUserAddress record); int updateByPrimaryKey(MallUserAddress record); } ================================================ FILE: newbee-mall-cloud-order-service/newbee-mall-cloud-order-web/src/main/java/ltd/order/cloud/newbee/dao/NewBeeMallOrderAddressMapper.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.order.cloud.newbee.dao; import ltd.order.cloud.newbee.entity.NewBeeMallOrderAddress; public interface NewBeeMallOrderAddressMapper { int deleteByPrimaryKey(Long orderId); int insert(NewBeeMallOrderAddress record); int insertSelective(NewBeeMallOrderAddress record); NewBeeMallOrderAddress selectByPrimaryKey(Long orderId); int updateByPrimaryKeySelective(NewBeeMallOrderAddress record); int updateByPrimaryKey(NewBeeMallOrderAddress record); } ================================================ FILE: newbee-mall-cloud-order-service/newbee-mall-cloud-order-web/src/main/java/ltd/order/cloud/newbee/dao/NewBeeMallOrderItemMapper.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.order.cloud.newbee.dao; import ltd.order.cloud.newbee.entity.NewBeeMallOrderItem; import org.apache.ibatis.annotations.Param; import java.util.List; public interface NewBeeMallOrderItemMapper { int deleteByPrimaryKey(Long orderItemId); int insert(NewBeeMallOrderItem record); int insertSelective(NewBeeMallOrderItem record); NewBeeMallOrderItem selectByPrimaryKey(Long orderItemId); /** * 根据订单id获取订单项列表 * * @param orderId * @return */ List selectByOrderId(Long orderId); /** * 根据订单ids获取订单项列表 * * @param orderIds * @return */ List selectByOrderIds(@Param("orderIds") List orderIds); /** * 批量insert订单项数据 * * @param orderItems * @return */ int insertBatch(@Param("orderItems") List orderItems); int updateByPrimaryKeySelective(NewBeeMallOrderItem record); int updateByPrimaryKey(NewBeeMallOrderItem record); } ================================================ FILE: newbee-mall-cloud-order-service/newbee-mall-cloud-order-web/src/main/java/ltd/order/cloud/newbee/dao/NewBeeMallOrderMapper.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.order.cloud.newbee.dao; import ltd.common.cloud.newbee.dto.PageQueryUtil; import ltd.order.cloud.newbee.entity.NewBeeMallOrder; import org.apache.ibatis.annotations.Param; import java.util.List; public interface NewBeeMallOrderMapper { int deleteByPrimaryKey(Long orderId); int insert(NewBeeMallOrder record); int insertSelective(NewBeeMallOrder record); NewBeeMallOrder selectByPrimaryKey(Long orderId); NewBeeMallOrder selectByOrderNo(String orderNo); int updateByPrimaryKeySelective(NewBeeMallOrder record); int updateByPrimaryKey(NewBeeMallOrder record); List findNewBeeMallOrderList(PageQueryUtil pageUtil); int getTotalNewBeeMallOrders(PageQueryUtil pageUtil); List selectByPrimaryKeys(@Param("orderIds") List orderIds); int checkOut(@Param("orderIds") List orderIds); int closeOrder(@Param("orderIds") List orderIds, @Param("orderStatus") int orderStatus); int checkDone(@Param("orderIds") List asList); } ================================================ FILE: newbee-mall-cloud-order-service/newbee-mall-cloud-order-web/src/main/java/ltd/order/cloud/newbee/entity/LoginAdminUser.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本系统已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.order.cloud.newbee.entity; import lombok.Data; @Data public class LoginAdminUser { private Long adminUserId; private String loginUserName; private String loginPassword; private String nickName; private Byte locked; } ================================================ FILE: newbee-mall-cloud-order-service/newbee-mall-cloud-order-web/src/main/java/ltd/order/cloud/newbee/entity/MallUserAddress.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.order.cloud.newbee.entity; import lombok.Data; import java.util.Date; @Data public class MallUserAddress { private Long addressId; private Long userId; private String userName; private String userPhone; private Byte defaultFlag; private String provinceName; private String cityName; private String regionName; private String detailAddress; private Byte isDeleted; private Date createTime; private Date updateTime; } ================================================ FILE: newbee-mall-cloud-order-service/newbee-mall-cloud-order-web/src/main/java/ltd/order/cloud/newbee/entity/NewBeeMallOrder.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.order.cloud.newbee.entity; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import java.util.Date; @Data public class NewBeeMallOrder { private Long orderId; private String orderNo; private Long userId; private Integer totalPrice; private Byte payStatus; private Byte payType; private Date payTime; private Byte orderStatus; private String extraInfo; private Byte isDeleted; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date createTime; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date updateTime; } ================================================ FILE: newbee-mall-cloud-order-service/newbee-mall-cloud-order-web/src/main/java/ltd/order/cloud/newbee/entity/NewBeeMallOrderAddress.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.order.cloud.newbee.entity; import lombok.Data; @Data public class NewBeeMallOrderAddress { private Long orderId; private String userName; private String userPhone; private String provinceName; private String cityName; private String regionName; private String detailAddress; } ================================================ FILE: newbee-mall-cloud-order-service/newbee-mall-cloud-order-web/src/main/java/ltd/order/cloud/newbee/entity/NewBeeMallOrderItem.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.order.cloud.newbee.entity; import lombok.Data; import java.util.Date; @Data public class NewBeeMallOrderItem { private Long orderItemId; private Long orderId; private Long goodsId; private String goodsName; private String goodsCoverImg; private Integer sellingPrice; private Integer goodsCount; private Date createTime; } ================================================ FILE: newbee-mall-cloud-order-service/newbee-mall-cloud-order-web/src/main/java/ltd/order/cloud/newbee/service/NewBeeMallOrderService.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.order.cloud.newbee.service; import ltd.common.cloud.newbee.dto.PageQueryUtil; import ltd.common.cloud.newbee.dto.PageResult; import ltd.order.cloud.newbee.controller.vo.NewBeeMallOrderDetailVO; import ltd.order.cloud.newbee.controller.vo.NewBeeMallOrderItemVO; import ltd.order.cloud.newbee.entity.MallUserAddress; import ltd.order.cloud.newbee.entity.NewBeeMallOrder; import java.util.List; public interface NewBeeMallOrderService { /** * 获取订单详情 * * @param orderId * @return */ NewBeeMallOrderDetailVO getOrderDetailByOrderId(Long orderId); /** * 获取订单详情 * * @param orderNo * @param userId * @return */ NewBeeMallOrderDetailVO getOrderDetailByOrderNo(String orderNo, Long userId); /** * 我的订单列表 * * @param pageUtil * @return */ PageResult getMyOrders(PageQueryUtil pageUtil); /** * 手动取消订单 * * @param orderNo * @param userId * @return */ String cancelOrder(String orderNo, Long userId); /** * 确认收货 * * @param orderNo * @param userId * @return */ String finishOrder(String orderNo, Long userId); String paySuccess(String orderNo, int payType); /** * 生成订单 * @param mallUserId * @param address * @param cartItemIds * @return */ String saveOrder(Long mallUserId, MallUserAddress address, List cartItemIds); /** * 后台分页 * * @param pageUtil * @return */ PageResult getNewBeeMallOrdersPage(PageQueryUtil pageUtil); /** * 订单信息修改 * * @param newBeeMallOrder * @return */ String updateOrderInfo(NewBeeMallOrder newBeeMallOrder); /** * 配货 * * @param ids * @return */ String checkDone(Long[] ids); /** * 出库 * * @param ids * @return */ String checkOut(Long[] ids); /** * 关闭订单 * * @param ids * @return */ String closeOrder(Long[] ids); List getOrderItems(Long orderId); } ================================================ FILE: newbee-mall-cloud-order-service/newbee-mall-cloud-order-web/src/main/java/ltd/order/cloud/newbee/service/NewBeeMallUserAddressService.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.order.cloud.newbee.service; import ltd.order.cloud.newbee.controller.vo.NewBeeMallUserAddressVO; import ltd.order.cloud.newbee.entity.MallUserAddress; import java.util.List; public interface NewBeeMallUserAddressService { /** * 获取我的收货地址 * * @param userId * @return */ List getMyAddresses(Long userId); /** * 保存收货地址 * * @param mallUserAddress * @return */ Boolean saveUserAddress(MallUserAddress mallUserAddress); /** * 修改收货地址 * * @param mallUserAddress * @return */ Boolean updateMallUserAddress(MallUserAddress mallUserAddress); /** * 获取收货地址详情 * * @param addressId * @return */ MallUserAddress getMallUserAddressById(Long addressId); /** * 获取我的默认收货地址 * * @param userId * @return */ MallUserAddress getMyDefaultAddressByUserId(Long userId); /** * 删除收货地址 * * @param addressId * @return */ Boolean deleteById(Long addressId); } ================================================ FILE: newbee-mall-cloud-order-service/newbee-mall-cloud-order-web/src/main/java/ltd/order/cloud/newbee/service/impl/NewBeeMallOrderServiceImpl.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.order.cloud.newbee.service.impl; import io.seata.spring.annotation.GlobalTransactional; import ltd.common.cloud.newbee.enums.ServiceResultEnum; import ltd.common.cloud.newbee.dto.PageQueryUtil; import ltd.common.cloud.newbee.dto.PageResult; import ltd.common.cloud.newbee.dto.Result; import ltd.common.cloud.newbee.enums.NewBeeMallOrderStatusEnum; import ltd.common.cloud.newbee.enums.PayStatusEnum; import ltd.common.cloud.newbee.enums.PayTypeEnum; import ltd.common.cloud.newbee.exception.NewBeeMallException; import ltd.common.cloud.newbee.util.BeanUtil; import ltd.common.cloud.newbee.util.NumberUtil; import ltd.goods.cloud.newbee.dto.NewBeeMallGoodsDTO; import ltd.goods.cloud.newbee.dto.StockNumDTO; import ltd.goods.cloud.newbee.dto.UpdateStockNumDTO; import ltd.goods.cloud.newbee.openfeign.NewBeeCloudGoodsServiceFeign; import ltd.order.cloud.newbee.controller.vo.NewBeeMallOrderDetailVO; import ltd.order.cloud.newbee.controller.vo.NewBeeMallOrderItemVO; import ltd.order.cloud.newbee.controller.vo.NewBeeMallOrderListVO; import ltd.order.cloud.newbee.dao.NewBeeMallOrderAddressMapper; import ltd.order.cloud.newbee.dao.NewBeeMallOrderItemMapper; import ltd.order.cloud.newbee.dao.NewBeeMallOrderMapper; import ltd.order.cloud.newbee.entity.MallUserAddress; import ltd.order.cloud.newbee.entity.NewBeeMallOrder; import ltd.order.cloud.newbee.entity.NewBeeMallOrderAddress; import ltd.order.cloud.newbee.entity.NewBeeMallOrderItem; import ltd.order.cloud.newbee.service.NewBeeMallOrderService; import ltd.shopcart.cloud.newbee.dto.NewBeeMallShoppingCartItemDTO; import ltd.shopcart.cloud.newbee.openfeign.NewBeeCloudShopCartServiceFeign; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; import static java.util.stream.Collectors.groupingBy; @Service public class NewBeeMallOrderServiceImpl implements NewBeeMallOrderService { @Autowired private NewBeeMallOrderMapper newBeeMallOrderMapper; @Autowired private NewBeeMallOrderItemMapper newBeeMallOrderItemMapper; @Autowired private NewBeeMallOrderAddressMapper newBeeMallOrderAddressMapper; @Autowired private NewBeeCloudGoodsServiceFeign goodsService; @Autowired private NewBeeCloudShopCartServiceFeign shopCartService; @Override public NewBeeMallOrderDetailVO getOrderDetailByOrderId(Long orderId) { NewBeeMallOrder newBeeMallOrder = newBeeMallOrderMapper.selectByPrimaryKey(orderId); if (newBeeMallOrder == null) { NewBeeMallException.fail(ServiceResultEnum.DATA_NOT_EXIST.getResult()); } List orderItems = newBeeMallOrderItemMapper.selectByOrderId(newBeeMallOrder.getOrderId()); //获取订单项数据 if (!CollectionUtils.isEmpty(orderItems)) { List newBeeMallOrderItemVOS = BeanUtil.copyList(orderItems, NewBeeMallOrderItemVO.class); NewBeeMallOrderDetailVO newBeeMallOrderDetailVO = new NewBeeMallOrderDetailVO(); BeanUtil.copyProperties(newBeeMallOrder, newBeeMallOrderDetailVO); newBeeMallOrderDetailVO.setOrderStatusString(NewBeeMallOrderStatusEnum.getNewBeeMallOrderStatusEnumByStatus(newBeeMallOrderDetailVO.getOrderStatus()).getName()); newBeeMallOrderDetailVO.setPayTypeString(PayTypeEnum.getPayTypeEnumByType(newBeeMallOrderDetailVO.getPayType()).getName()); newBeeMallOrderDetailVO.setNewBeeMallOrderItemVOS(newBeeMallOrderItemVOS); return newBeeMallOrderDetailVO; } else { NewBeeMallException.fail(ServiceResultEnum.ORDER_ITEM_NULL_ERROR.getResult()); return null; } } @Override public NewBeeMallOrderDetailVO getOrderDetailByOrderNo(String orderNo, Long userId) { NewBeeMallOrder newBeeMallOrder = newBeeMallOrderMapper.selectByOrderNo(orderNo); if (newBeeMallOrder == null) { NewBeeMallException.fail(ServiceResultEnum.DATA_NOT_EXIST.getResult()); } if (!userId.equals(newBeeMallOrder.getUserId())) { NewBeeMallException.fail(ServiceResultEnum.REQUEST_FORBIDEN_ERROR.getResult()); } List orderItems = newBeeMallOrderItemMapper.selectByOrderId(newBeeMallOrder.getOrderId()); //获取订单项数据 if (CollectionUtils.isEmpty(orderItems)) { NewBeeMallException.fail(ServiceResultEnum.ORDER_ITEM_NOT_EXIST_ERROR.getResult()); } List newBeeMallOrderItemVOS = BeanUtil.copyList(orderItems, NewBeeMallOrderItemVO.class); NewBeeMallOrderDetailVO newBeeMallOrderDetailVO = new NewBeeMallOrderDetailVO(); BeanUtil.copyProperties(newBeeMallOrder, newBeeMallOrderDetailVO); newBeeMallOrderDetailVO.setOrderStatusString(NewBeeMallOrderStatusEnum.getNewBeeMallOrderStatusEnumByStatus(newBeeMallOrderDetailVO.getOrderStatus()).getName()); newBeeMallOrderDetailVO.setPayTypeString(PayTypeEnum.getPayTypeEnumByType(newBeeMallOrderDetailVO.getPayType()).getName()); newBeeMallOrderDetailVO.setNewBeeMallOrderItemVOS(newBeeMallOrderItemVOS); return newBeeMallOrderDetailVO; } @Override public PageResult getMyOrders(PageQueryUtil pageUtil) { int total = newBeeMallOrderMapper.getTotalNewBeeMallOrders(pageUtil); List newBeeMallOrders = newBeeMallOrderMapper.findNewBeeMallOrderList(pageUtil); List orderListVOS = new ArrayList<>(); if (total > 0) { //数据转换 将实体类转成vo orderListVOS = BeanUtil.copyList(newBeeMallOrders, NewBeeMallOrderListVO.class); //设置订单状态中文显示值 for (NewBeeMallOrderListVO newBeeMallOrderListVO : orderListVOS) { newBeeMallOrderListVO.setOrderStatusString(NewBeeMallOrderStatusEnum.getNewBeeMallOrderStatusEnumByStatus(newBeeMallOrderListVO.getOrderStatus()).getName()); } List orderIds = newBeeMallOrders.stream().map(NewBeeMallOrder::getOrderId).collect(Collectors.toList()); if (!CollectionUtils.isEmpty(orderIds)) { List orderItems = newBeeMallOrderItemMapper.selectByOrderIds(orderIds); Map> itemByOrderIdMap = orderItems.stream().collect(groupingBy(NewBeeMallOrderItem::getOrderId)); for (NewBeeMallOrderListVO newBeeMallOrderListVO : orderListVOS) { //封装每个订单列表对象的订单项数据 if (itemByOrderIdMap.containsKey(newBeeMallOrderListVO.getOrderId())) { List orderItemListTemp = itemByOrderIdMap.get(newBeeMallOrderListVO.getOrderId()); //将NewBeeMallOrderItem对象列表转换成NewBeeMallOrderItemVO对象列表 List newBeeMallOrderItemVOS = BeanUtil.copyList(orderItemListTemp, NewBeeMallOrderItemVO.class); newBeeMallOrderListVO.setNewBeeMallOrderItemVOS(newBeeMallOrderItemVOS); } } } } PageResult pageResult = new PageResult(orderListVOS, total, pageUtil.getLimit(), pageUtil.getPage()); return pageResult; } @Override public String cancelOrder(String orderNo, Long userId) { NewBeeMallOrder newBeeMallOrder = newBeeMallOrderMapper.selectByOrderNo(orderNo); if (newBeeMallOrder != null) { //验证是否是当前userId下的订单,否则报错 if (!userId.equals(newBeeMallOrder.getUserId())) { NewBeeMallException.fail(ServiceResultEnum.NO_PERMISSION_ERROR.getResult()); } //订单状态判断 if (newBeeMallOrder.getOrderStatus().intValue() == NewBeeMallOrderStatusEnum.ORDER_SUCCESS.getOrderStatus() || newBeeMallOrder.getOrderStatus().intValue() == NewBeeMallOrderStatusEnum.ORDER_CLOSED_BY_MALLUSER.getOrderStatus() || newBeeMallOrder.getOrderStatus().intValue() == NewBeeMallOrderStatusEnum.ORDER_CLOSED_BY_EXPIRED.getOrderStatus() || newBeeMallOrder.getOrderStatus().intValue() == NewBeeMallOrderStatusEnum.ORDER_CLOSED_BY_JUDGE.getOrderStatus()) { return ServiceResultEnum.ORDER_STATUS_ERROR.getResult(); } if (newBeeMallOrderMapper.closeOrder(Collections.singletonList(newBeeMallOrder.getOrderId()), NewBeeMallOrderStatusEnum.ORDER_CLOSED_BY_MALLUSER.getOrderStatus()) > 0) { return ServiceResultEnum.SUCCESS.getResult(); } else { return ServiceResultEnum.DB_ERROR.getResult(); } } return ServiceResultEnum.ORDER_NOT_EXIST_ERROR.getResult(); } @Override public String finishOrder(String orderNo, Long userId) { NewBeeMallOrder newBeeMallOrder = newBeeMallOrderMapper.selectByOrderNo(orderNo); if (newBeeMallOrder != null) { //验证是否是当前userId下的订单,否则报错 if (!userId.equals(newBeeMallOrder.getUserId())) { return ServiceResultEnum.NO_PERMISSION_ERROR.getResult(); } //订单状态判断 非出库状态下不进行修改操作 if (newBeeMallOrder.getOrderStatus().intValue() != NewBeeMallOrderStatusEnum.ORDER_EXPRESS.getOrderStatus()) { return ServiceResultEnum.ORDER_STATUS_ERROR.getResult(); } newBeeMallOrder.setOrderStatus((byte) NewBeeMallOrderStatusEnum.ORDER_SUCCESS.getOrderStatus()); newBeeMallOrder.setUpdateTime(new Date()); if (newBeeMallOrderMapper.updateByPrimaryKeySelective(newBeeMallOrder) > 0) { return ServiceResultEnum.SUCCESS.getResult(); } else { return ServiceResultEnum.DB_ERROR.getResult(); } } return ServiceResultEnum.ORDER_NOT_EXIST_ERROR.getResult(); } @Override public String paySuccess(String orderNo, int payType) { NewBeeMallOrder newBeeMallOrder = newBeeMallOrderMapper.selectByOrderNo(orderNo); if (newBeeMallOrder != null) { //订单状态判断 非待支付状态下不进行修改操作 if (newBeeMallOrder.getOrderStatus().intValue() != NewBeeMallOrderStatusEnum.ORDER_PRE_PAY.getOrderStatus()) { return ServiceResultEnum.ORDER_STATUS_ERROR.getResult(); } newBeeMallOrder.setOrderStatus((byte) NewBeeMallOrderStatusEnum.ORDER_PAID.getOrderStatus()); newBeeMallOrder.setPayType((byte) payType); newBeeMallOrder.setPayStatus((byte) PayStatusEnum.PAY_SUCCESS.getPayStatus()); newBeeMallOrder.setPayTime(new Date()); newBeeMallOrder.setUpdateTime(new Date()); if (newBeeMallOrderMapper.updateByPrimaryKeySelective(newBeeMallOrder) > 0) { return ServiceResultEnum.SUCCESS.getResult(); } else { return ServiceResultEnum.DB_ERROR.getResult(); } } return ServiceResultEnum.ORDER_NOT_EXIST_ERROR.getResult(); } @Override @Transactional @GlobalTransactional public String saveOrder(Long mallUserId, MallUserAddress address, List cartItemIds) { //调用购物车服务feign获取数据 Result> cartItemDTOListResult = shopCartService.listByCartItemIds(cartItemIds); if (cartItemDTOListResult == null || cartItemDTOListResult.getResultCode() != 200) { NewBeeMallException.fail("参数异常"); } List itemsForSave = cartItemDTOListResult.getData(); if (CollectionUtils.isEmpty(itemsForSave)) { //无数据 NewBeeMallException.fail("参数异常"); } List itemIdList = itemsForSave.stream().map(NewBeeMallShoppingCartItemDTO::getCartItemId).collect(Collectors.toList()); List goodsIds = itemsForSave.stream().map(NewBeeMallShoppingCartItemDTO::getGoodsId).collect(Collectors.toList()); //调用商品服务feign获取数据 Result> goodsDTOListResult = goodsService.listByGoodsIds(goodsIds); if (goodsDTOListResult == null || goodsDTOListResult.getResultCode() != 200) { NewBeeMallException.fail("参数异常"); } List newBeeMallGoods = goodsDTOListResult.getData(); //检查是否包含已下架商品 List goodsListNotSelling = newBeeMallGoods.stream() .filter(newBeeMallGoodsTemp -> newBeeMallGoodsTemp.getGoodsSellStatus() != 0) .collect(Collectors.toList()); if (!CollectionUtils.isEmpty(goodsListNotSelling)) { //goodsListNotSelling 对象非空则表示有下架商品 NewBeeMallException.fail(goodsListNotSelling.get(0).getGoodsName() + "已下架,无法生成订单"); } Map newBeeMallGoodsMap = newBeeMallGoods.stream().collect(Collectors.toMap(NewBeeMallGoodsDTO::getGoodsId, Function.identity(), (entity1, entity2) -> entity1)); //判断商品库存 for (NewBeeMallShoppingCartItemDTO cartItemDTO : itemsForSave) { //查出的商品中不存在购物车中的这条关联商品数据,直接返回错误提醒 if (!newBeeMallGoodsMap.containsKey(cartItemDTO.getGoodsId())) { NewBeeMallException.fail(ServiceResultEnum.SHOPPING_ITEM_ERROR.getResult()); } //存在数量大于库存的情况,直接返回错误提醒 if (cartItemDTO.getGoodsCount() > newBeeMallGoodsMap.get(cartItemDTO.getGoodsId()).getStockNum()) { NewBeeMallException.fail(ServiceResultEnum.SHOPPING_ITEM_COUNT_ERROR.getResult()); } } //删除购物项 if (!CollectionUtils.isEmpty(itemIdList) && !CollectionUtils.isEmpty(goodsIds) && !CollectionUtils.isEmpty(newBeeMallGoods)) { //调用购物车服务feign删除数据 Result deleteByCartItemIdsResult = shopCartService.deleteByCartItemIds(itemIdList); if (deleteByCartItemIdsResult != null && deleteByCartItemIdsResult.getResultCode() == 200) { List stockNumDTOS = BeanUtil.copyList(itemsForSave, StockNumDTO.class); UpdateStockNumDTO updateStockNumDTO = new UpdateStockNumDTO(); updateStockNumDTO.setStockNumDTOS(stockNumDTOS); //调用商品服务feign修改库存数据 Result updateStockResult = goodsService.updateStock(updateStockNumDTO); if (updateStockResult == null || updateStockResult.getResultCode() != 200) { NewBeeMallException.fail(ServiceResultEnum.PARAM_ERROR.getResult()); } if (!updateStockResult.getData()) { NewBeeMallException.fail(ServiceResultEnum.SHOPPING_ITEM_COUNT_ERROR.getResult()); } //生成订单号 String orderNo = NumberUtil.genOrderNo(); int priceTotal = 0; //保存订单 NewBeeMallOrder newBeeMallOrder = new NewBeeMallOrder(); newBeeMallOrder.setOrderNo(orderNo); newBeeMallOrder.setUserId(mallUserId); //总价 for (NewBeeMallShoppingCartItemDTO cartItemDTO : itemsForSave) { priceTotal += cartItemDTO.getGoodsCount() * newBeeMallGoodsMap.get(cartItemDTO.getGoodsId()).getSellingPrice(); } if (priceTotal < 1) { NewBeeMallException.fail(ServiceResultEnum.ORDER_PRICE_ERROR.getResult()); } newBeeMallOrder.setTotalPrice(priceTotal); String extraInfo = ""; newBeeMallOrder.setExtraInfo(extraInfo); //生成订单项并保存订单项纪录 if (newBeeMallOrderMapper.insertSelective(newBeeMallOrder) > 0) { //生成订单收货地址快照,并保存至数据库 NewBeeMallOrderAddress newBeeMallOrderAddress = new NewBeeMallOrderAddress(); BeanUtil.copyProperties(address, newBeeMallOrderAddress); newBeeMallOrderAddress.setOrderId(newBeeMallOrder.getOrderId()); //生成所有的订单项快照,并保存至数据库 List newBeeMallOrderItems = new ArrayList<>(); for (NewBeeMallShoppingCartItemDTO cartItemDTO : itemsForSave) { NewBeeMallOrderItem newBeeMallOrderItem = new NewBeeMallOrderItem(); //使用BeanUtil工具类将cartItemDTO中的属性复制到newBeeMallOrderItem对象中 BeanUtil.copyProperties(cartItemDTO, newBeeMallOrderItem); newBeeMallOrderItem.setGoodsCoverImg(newBeeMallGoodsMap.get(cartItemDTO.getGoodsId()).getGoodsCoverImg()); newBeeMallOrderItem.setGoodsName(newBeeMallGoodsMap.get(cartItemDTO.getGoodsId()).getGoodsName()); newBeeMallOrderItem.setSellingPrice(newBeeMallGoodsMap.get(cartItemDTO.getGoodsId()).getSellingPrice()); //NewBeeMallOrderMapper文件insert()方法中使用了useGeneratedKeys因此orderId可以获取到 newBeeMallOrderItem.setOrderId(newBeeMallOrder.getOrderId()); newBeeMallOrderItems.add(newBeeMallOrderItem); } //保存至数据库 if (newBeeMallOrderItemMapper.insertBatch(newBeeMallOrderItems) > 0 && newBeeMallOrderAddressMapper.insertSelective(newBeeMallOrderAddress) > 0) { //所有操作成功后,将订单号返回,以供Controller方法跳转到订单详情 return orderNo; } NewBeeMallException.fail(ServiceResultEnum.ORDER_PRICE_ERROR.getResult()); } NewBeeMallException.fail(ServiceResultEnum.DB_ERROR.getResult()); } NewBeeMallException.fail(ServiceResultEnum.DB_ERROR.getResult()); } NewBeeMallException.fail(ServiceResultEnum.SHOPPING_ITEM_ERROR.getResult()); return ServiceResultEnum.SHOPPING_ITEM_ERROR.getResult(); } @Override public PageResult getNewBeeMallOrdersPage(PageQueryUtil pageUtil) { List newBeeMallOrders = newBeeMallOrderMapper.findNewBeeMallOrderList(pageUtil); int total = newBeeMallOrderMapper.getTotalNewBeeMallOrders(pageUtil); PageResult pageResult = new PageResult(newBeeMallOrders, total, pageUtil.getLimit(), pageUtil.getPage()); return pageResult; } @Override @Transactional public String updateOrderInfo(NewBeeMallOrder newBeeMallOrder) { NewBeeMallOrder temp = newBeeMallOrderMapper.selectByPrimaryKey(newBeeMallOrder.getOrderId()); //不为空且orderStatus>=0且状态为出库之前可以修改部分信息 if (temp != null && temp.getOrderStatus() >= 0 && temp.getOrderStatus() < 3) { temp.setTotalPrice(newBeeMallOrder.getTotalPrice()); temp.setUpdateTime(new Date()); if (newBeeMallOrderMapper.updateByPrimaryKeySelective(temp) > 0) { return ServiceResultEnum.SUCCESS.getResult(); } return ServiceResultEnum.DB_ERROR.getResult(); } return ServiceResultEnum.DATA_NOT_EXIST.getResult(); } @Override @Transactional public String checkDone(Long[] ids) { //查询所有的订单 判断状态 修改状态和更新时间 List orders = newBeeMallOrderMapper.selectByPrimaryKeys(Arrays.asList(ids)); String errorOrderNos = ""; if (!CollectionUtils.isEmpty(orders)) { for (NewBeeMallOrder newBeeMallOrder : orders) { if (newBeeMallOrder.getIsDeleted() == 1) { errorOrderNos += newBeeMallOrder.getOrderNo() + " "; continue; } if (newBeeMallOrder.getOrderStatus() != 1) { errorOrderNos += newBeeMallOrder.getOrderNo() + " "; } } if (!StringUtils.hasText(errorOrderNos)) { //订单状态正常 可以执行配货完成操作 修改订单状态和更新时间 if (newBeeMallOrderMapper.checkDone(Arrays.asList(ids)) > 0) { return ServiceResultEnum.SUCCESS.getResult(); } else { return ServiceResultEnum.DB_ERROR.getResult(); } } else { //订单此时不可执行出库操作 if (errorOrderNos.length() > 0 && errorOrderNos.length() < 100) { return errorOrderNos + "订单的状态不是支付成功无法执行出库操作"; } else { return "你选择了太多状态不是支付成功的订单,无法执行配货完成操作"; } } } //未查询到数据 返回错误提示 return ServiceResultEnum.DATA_NOT_EXIST.getResult(); } @Override @Transactional public String checkOut(Long[] ids) { //查询所有的订单 判断状态 修改状态和更新时间 List orders = newBeeMallOrderMapper.selectByPrimaryKeys(Arrays.asList(ids)); String errorOrderNos = ""; if (!CollectionUtils.isEmpty(orders)) { for (NewBeeMallOrder newBeeMallOrder : orders) { if (newBeeMallOrder.getIsDeleted() == 1) { errorOrderNos += newBeeMallOrder.getOrderNo() + " "; continue; } if (newBeeMallOrder.getOrderStatus() != 1 && newBeeMallOrder.getOrderStatus() != 2) { errorOrderNos += newBeeMallOrder.getOrderNo() + " "; } } if (!StringUtils.hasText(errorOrderNos)) { //订单状态正常 可以执行出库操作 修改订单状态和更新时间 if (newBeeMallOrderMapper.checkOut(Arrays.asList(ids)) > 0) { return ServiceResultEnum.SUCCESS.getResult(); } else { return ServiceResultEnum.DB_ERROR.getResult(); } } else { //订单此时不可执行出库操作 if (errorOrderNos.length() > 0 && errorOrderNos.length() < 100) { return errorOrderNos + "订单的状态不是支付成功或配货完成无法执行出库操作"; } else { return "你选择了太多状态不是支付成功或配货完成的订单,无法执行出库操作"; } } } //未查询到数据 返回错误提示 return ServiceResultEnum.DATA_NOT_EXIST.getResult(); } @Override @Transactional public String closeOrder(Long[] ids) { //查询所有的订单 判断状态 修改状态和更新时间 List orders = newBeeMallOrderMapper.selectByPrimaryKeys(Arrays.asList(ids)); String errorOrderNos = ""; if (!CollectionUtils.isEmpty(orders)) { for (NewBeeMallOrder newBeeMallOrder : orders) { // isDeleted=1 一定为已关闭订单 if (newBeeMallOrder.getIsDeleted() == 1) { errorOrderNos += newBeeMallOrder.getOrderNo() + " "; continue; } //已关闭或者已完成无法关闭订单 if (newBeeMallOrder.getOrderStatus() == 4 || newBeeMallOrder.getOrderStatus() < 0) { errorOrderNos += newBeeMallOrder.getOrderNo() + " "; } } if (!StringUtils.hasText(errorOrderNos)) { //订单状态正常 可以执行关闭操作 修改订单状态和更新时间 if (newBeeMallOrderMapper.closeOrder(Arrays.asList(ids), NewBeeMallOrderStatusEnum.ORDER_CLOSED_BY_JUDGE.getOrderStatus()) > 0) { return ServiceResultEnum.SUCCESS.getResult(); } else { return ServiceResultEnum.DB_ERROR.getResult(); } } else { //订单此时不可执行关闭操作 if (errorOrderNos.length() > 0 && errorOrderNos.length() < 100) { return errorOrderNos + "订单不能执行关闭操作"; } else { return "你选择的订单不能执行关闭操作"; } } } //未查询到数据 返回错误提示 return ServiceResultEnum.DATA_NOT_EXIST.getResult(); } @Override public List getOrderItems(Long orderId) { NewBeeMallOrder newBeeMallOrder = newBeeMallOrderMapper.selectByPrimaryKey(orderId); if (newBeeMallOrder != null) { List orderItems = newBeeMallOrderItemMapper.selectByOrderId(newBeeMallOrder.getOrderId()); //获取订单项数据 if (!CollectionUtils.isEmpty(orderItems)) { List newBeeMallOrderItemVOS = BeanUtil.copyList(orderItems, NewBeeMallOrderItemVO.class); return newBeeMallOrderItemVOS; } } return null; } } ================================================ FILE: newbee-mall-cloud-order-service/newbee-mall-cloud-order-web/src/main/java/ltd/order/cloud/newbee/service/impl/NewBeeMallUserAddressServiceImpl.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.order.cloud.newbee.service.impl; import ltd.common.cloud.newbee.enums.ServiceResultEnum; import ltd.common.cloud.newbee.exception.NewBeeMallException; import ltd.common.cloud.newbee.util.BeanUtil; import ltd.order.cloud.newbee.controller.vo.NewBeeMallUserAddressVO; import ltd.order.cloud.newbee.dao.MallUserAddressMapper; import ltd.order.cloud.newbee.entity.MallUserAddress; import ltd.order.cloud.newbee.service.NewBeeMallUserAddressService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Date; import java.util.List; @Service public class NewBeeMallUserAddressServiceImpl implements NewBeeMallUserAddressService { @Autowired private MallUserAddressMapper userAddressMapper; @Override public List getMyAddresses(Long userId) { List myAddressList = userAddressMapper.findMyAddressList(userId); List newBeeMallUserAddressVOS = BeanUtil.copyList(myAddressList, NewBeeMallUserAddressVO.class); return newBeeMallUserAddressVOS; } @Override @Transactional public Boolean saveUserAddress(MallUserAddress mallUserAddress) { Date now = new Date(); if (mallUserAddress.getDefaultFlag().intValue() == 1) { //添加默认地址,需要将原有的默认地址修改掉 MallUserAddress defaultAddress = userAddressMapper.getMyDefaultAddress(mallUserAddress.getUserId()); if (defaultAddress != null) { defaultAddress.setDefaultFlag((byte) 0); defaultAddress.setUpdateTime(now); int updateResult = userAddressMapper.updateByPrimaryKeySelective(defaultAddress); if (updateResult < 1) { //未更新成功 NewBeeMallException.fail(ServiceResultEnum.DB_ERROR.getResult()); } } } return userAddressMapper.insertSelective(mallUserAddress) > 0; } @Override public Boolean updateMallUserAddress(MallUserAddress mallUserAddress) { MallUserAddress tempAddress = getMallUserAddressById(mallUserAddress.getAddressId()); Date now = new Date(); if (mallUserAddress.getDefaultFlag().intValue() == 1) { //修改为默认地址,需要将原有的默认地址修改掉 MallUserAddress defaultAddress = userAddressMapper.getMyDefaultAddress(mallUserAddress.getUserId()); if (defaultAddress != null && !defaultAddress.getAddressId().equals(tempAddress)) { //存在默认地址且默认地址并不是当前修改的地址 defaultAddress.setDefaultFlag((byte) 0); defaultAddress.setUpdateTime(now); int updateResult = userAddressMapper.updateByPrimaryKeySelective(defaultAddress); if (updateResult < 1) { //未更新成功 NewBeeMallException.fail(ServiceResultEnum.DB_ERROR.getResult()); } } } mallUserAddress.setUpdateTime(now); return userAddressMapper.updateByPrimaryKeySelective(mallUserAddress) > 0; } @Override public MallUserAddress getMallUserAddressById(Long addressId) { MallUserAddress mallUserAddress = userAddressMapper.selectByPrimaryKey(addressId); if (mallUserAddress == null) { NewBeeMallException.fail(ServiceResultEnum.DATA_NOT_EXIST.getResult()); } return mallUserAddress; } @Override public MallUserAddress getMyDefaultAddressByUserId(Long userId) { return userAddressMapper.getMyDefaultAddress(userId); } @Override public Boolean deleteById(Long addressId) { return userAddressMapper.deleteByPrimaryKey(addressId) > 0; } } ================================================ FILE: newbee-mall-cloud-order-service/newbee-mall-cloud-order-web/src/main/resources/application.properties ================================================ server.port=29040 # 服务名称 spring.application.name=newbee-mall-cloud-order-service # Nacos地址 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 # Nacos登录用户名(默认为nacos,生产环境一定要修改) spring.cloud.nacos.username=nacos # Nacos登录密码(默认为nacos,生产环境一定要修改) spring.cloud.nacos.password=nacos # datasource config (MySQL) spring.datasource.name=newbee-mall-cloud-order-datasource spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/newbee_mall_cloud_order_db?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=utf8&autoReconnect=true&useSSL=false spring.datasource.username=root spring.datasource.password=123456 # 指定数据源类型 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource # Druid 数据源设置 # 初始化时建立数据库连接的个数 spring.datasource.initialSize=10 # 最小连接池数量 spring.datasource.minIdle=5 # 最大连接池数量 spring.datasource.maxActive=30 # 配置获取连接等待超时的时间 spring.datasource.maxWait=60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 spring.datasource.timeBetweenEvictionRunsMillis=60000 # 配置一个连接在池中最小生存的时间,单位是毫秒 spring.datasource.minEvictableIdleTimeMillis=300000 # 用来检测连接是否有效的SQL语句 spring.datasource.validationQuery=SELECT 1 spring.datasource.testWhileIdle=true spring.datasource.testOnBorrow=false spring.datasource.testOnReturn=false # mybatis config mybatis.mapper-locations=classpath:mapper/*Mapper.xml # sentinel config spring.cloud.sentinel.transport.port=8940 spring.cloud.sentinel.transport.clientIp=127.0.0.1 # 指定Sentinel控制台地址 spring.cloud.sentinel.transport.dashboard=127.0.0.1:9113 # openfeign config feign.client.config.default.connectTimeout=2000 feign.client.config.default.readTimeout=5000 feign.compression.request.enabled=true feign.compression.request.mime-types=text/xml,application/xml,application/json feign.compression.request.min-request-size=1024 feign.compression.response.enabled=true # 演示需要,开启OpenFeign和当前项目中的DEBUG级别日志 #logging.level.ltd.user.cloud.newbee.openfeign=debug #logging.level.ltd.goods.cloud.newbee.openfeign=debug #logging.level.ltd.shopcart.cloud.newbee.openfeign=debug #logging.level.ltd.order.cloud.newbee=debug # Sleuth采样率,取值范围为[0.1,1.0],值越大收集越及时,但性能影响也越大 spring.sleuth.sampler.probability=1.0 # 每秒数据采集量,最多n条/秒Trace spring.sleuth.sampler.rate=500 spring.zipkin.base-url=http://localhost:9411 seata.enabled=true seata.application-id=order-server #事务分组配置 seata.tx-service-group=newbee_cloud_save_order_group service.vgroupMapping.newbee_cloud_save_order_group=default #连接Nacos服务中心的配置信息 seata.registry.type=nacos seata.registry.nacos.application=seata-server seata.registry.nacos.server-addr=127.0.0.1:8848 seata.registry.nacos.username=nacos seata.registry.nacos.password=nacos seata.registry.nacos.group=DEFAULT_GROUP seata.registry.nacos.cluster=default ================================================ FILE: newbee-mall-cloud-order-service/newbee-mall-cloud-order-web/src/main/resources/logback.xml ================================================ ${APP_NAME} INFO ${CONSOLE_LOG_PATTERN} utf8 192.168.110.57:4560 INFO ================================================ FILE: newbee-mall-cloud-order-service/newbee-mall-cloud-order-web/src/main/resources/mapper/MallUserAddressMapper.xml ================================================ address_id, user_id, user_name, user_phone, default_flag, province_name, city_name, region_name, detail_address, is_deleted, create_time, update_time update tb_newbee_mall_user_address set is_deleted = 1 where address_id = #{addressId,jdbcType=BIGINT} insert into tb_newbee_mall_user_address (address_id, user_id, user_name, user_phone, default_flag, province_name, city_name, region_name, detail_address, is_deleted, create_time, update_time ) values (#{addressId,jdbcType=BIGINT}, #{userId,jdbcType=BIGINT}, #{userName,jdbcType=VARCHAR}, #{userPhone,jdbcType=VARCHAR}, #{defaultFlag,jdbcType=TINYINT}, #{provinceName,jdbcType=VARCHAR}, #{cityName,jdbcType=VARCHAR}, #{regionName,jdbcType=VARCHAR}, #{detailAddress,jdbcType=VARCHAR}, #{isDeleted,jdbcType=TINYINT}, #{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP} ) insert into tb_newbee_mall_user_address address_id, user_id, user_name, user_phone, default_flag, province_name, city_name, region_name, detail_address, is_deleted, create_time, update_time, #{addressId,jdbcType=BIGINT}, #{userId,jdbcType=BIGINT}, #{userName,jdbcType=VARCHAR}, #{userPhone,jdbcType=VARCHAR}, #{defaultFlag,jdbcType=TINYINT}, #{provinceName,jdbcType=VARCHAR}, #{cityName,jdbcType=VARCHAR}, #{regionName,jdbcType=VARCHAR}, #{detailAddress,jdbcType=VARCHAR}, #{isDeleted,jdbcType=TINYINT}, #{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP}, update tb_newbee_mall_user_address user_id = #{userId,jdbcType=BIGINT}, user_name = #{userName,jdbcType=VARCHAR}, user_phone = #{userPhone,jdbcType=VARCHAR}, default_flag = #{defaultFlag,jdbcType=TINYINT}, province_name = #{provinceName,jdbcType=VARCHAR}, city_name = #{cityName,jdbcType=VARCHAR}, region_name = #{regionName,jdbcType=VARCHAR}, detail_address = #{detailAddress,jdbcType=VARCHAR}, is_deleted = #{isDeleted,jdbcType=TINYINT}, create_time = #{createTime,jdbcType=TIMESTAMP}, update_time = #{updateTime,jdbcType=TIMESTAMP}, where address_id = #{addressId,jdbcType=BIGINT} update tb_newbee_mall_user_address set user_id = #{userId,jdbcType=BIGINT}, user_name = #{userName,jdbcType=VARCHAR}, user_phone = #{userPhone,jdbcType=VARCHAR}, default_flag = #{defaultFlag,jdbcType=TINYINT}, province_name = #{provinceName,jdbcType=VARCHAR}, city_name = #{cityName,jdbcType=VARCHAR}, region_name = #{regionName,jdbcType=VARCHAR}, detail_address = #{detailAddress,jdbcType=VARCHAR}, is_deleted = #{isDeleted,jdbcType=TINYINT}, create_time = #{createTime,jdbcType=TIMESTAMP}, update_time = #{updateTime,jdbcType=TIMESTAMP} where address_id = #{addressId,jdbcType=BIGINT} ================================================ FILE: newbee-mall-cloud-order-service/newbee-mall-cloud-order-web/src/main/resources/mapper/NewBeeMallOrderAddressMapper.xml ================================================ order_id, user_name, user_phone, province_name, city_name, region_name, detail_address delete from tb_newbee_mall_order_address where order_id = #{orderId,jdbcType=BIGINT} insert into tb_newbee_mall_order_address (order_id, user_name, user_phone, province_name, city_name, region_name, detail_address) values (#{orderId,jdbcType=BIGINT}, #{userName,jdbcType=VARCHAR}, #{userPhone,jdbcType=VARCHAR}, #{provinceName,jdbcType=VARCHAR}, #{cityName,jdbcType=VARCHAR}, #{regionName,jdbcType=VARCHAR}, #{detailAddress,jdbcType=VARCHAR}) insert into tb_newbee_mall_order_address order_id, user_name, user_phone, province_name, city_name, region_name, detail_address, #{orderId,jdbcType=BIGINT}, #{userName,jdbcType=VARCHAR}, #{userPhone,jdbcType=VARCHAR}, #{provinceName,jdbcType=VARCHAR}, #{cityName,jdbcType=VARCHAR}, #{regionName,jdbcType=VARCHAR}, #{detailAddress,jdbcType=VARCHAR}, update tb_newbee_mall_order_address user_name = #{userName,jdbcType=VARCHAR}, user_phone = #{userPhone,jdbcType=VARCHAR}, province_name = #{provinceName,jdbcType=VARCHAR}, city_name = #{cityName,jdbcType=VARCHAR}, region_name = #{regionName,jdbcType=VARCHAR}, detail_address = #{detailAddress,jdbcType=VARCHAR}, where order_id = #{orderId,jdbcType=BIGINT} update tb_newbee_mall_order_address set user_name = #{userName,jdbcType=VARCHAR}, user_phone = #{userPhone,jdbcType=VARCHAR}, province_name = #{provinceName,jdbcType=VARCHAR}, city_name = #{cityName,jdbcType=VARCHAR}, region_name = #{regionName,jdbcType=VARCHAR}, detail_address = #{detailAddress,jdbcType=VARCHAR} where order_id = #{orderId,jdbcType=BIGINT} ================================================ FILE: newbee-mall-cloud-order-service/newbee-mall-cloud-order-web/src/main/resources/mapper/NewBeeMallOrderItemMapper.xml ================================================ order_item_id, order_id, goods_id, goods_name, goods_cover_img, selling_price, goods_count, create_time delete from tb_newbee_mall_order_item where order_item_id = #{orderItemId,jdbcType=BIGINT} insert into tb_newbee_mall_order_item (order_id, goods_id, goods_name, goods_cover_img, selling_price, goods_count) values (#{orderItem.orderId,jdbcType=BIGINT}, #{orderItem.goodsId,jdbcType=BIGINT}, #{orderItem.goodsName,jdbcType=VARCHAR}, #{orderItem.goodsCoverImg,jdbcType=VARCHAR}, #{orderItem.sellingPrice,jdbcType=INTEGER}, #{orderItem.goodsCount,jdbcType=INTEGER}) insert into tb_newbee_mall_order_item (order_item_id, order_id, goods_id, goods_name, goods_cover_img, selling_price, goods_count, create_time) values (#{orderItemId,jdbcType=BIGINT}, #{orderId,jdbcType=BIGINT}, #{goodsId,jdbcType=BIGINT}, #{goodsName,jdbcType=VARCHAR}, #{goodsCoverImg,jdbcType=VARCHAR}, #{sellingPrice,jdbcType=INTEGER}, #{goodsCount,jdbcType=INTEGER}, #{createTime,jdbcType=TIMESTAMP}) insert into tb_newbee_mall_order_item order_item_id, order_id, goods_id, goods_name, goods_cover_img, selling_price, goods_count, create_time, #{orderItemId,jdbcType=BIGINT}, #{orderId,jdbcType=BIGINT}, #{goodsId,jdbcType=BIGINT}, #{goodsName,jdbcType=VARCHAR}, #{goodsCoverImg,jdbcType=VARCHAR}, #{sellingPrice,jdbcType=INTEGER}, #{goodsCount,jdbcType=INTEGER}, #{createTime,jdbcType=TIMESTAMP}, update tb_newbee_mall_order_item order_id = #{orderId,jdbcType=BIGINT}, goods_id = #{goodsId,jdbcType=BIGINT}, goods_name = #{goodsName,jdbcType=VARCHAR}, goods_cover_img = #{goodsCoverImg,jdbcType=VARCHAR}, selling_price = #{sellingPrice,jdbcType=INTEGER}, goods_count = #{goodsCount,jdbcType=INTEGER}, create_time = #{createTime,jdbcType=TIMESTAMP}, where order_item_id = #{orderItemId,jdbcType=BIGINT} update tb_newbee_mall_order_item set order_id = #{orderId,jdbcType=BIGINT}, goods_id = #{goodsId,jdbcType=BIGINT}, goods_name = #{goodsName,jdbcType=VARCHAR}, goods_cover_img = #{goodsCoverImg,jdbcType=VARCHAR}, selling_price = #{sellingPrice,jdbcType=INTEGER}, goods_count = #{goodsCount,jdbcType=INTEGER}, create_time = #{createTime,jdbcType=TIMESTAMP} where order_item_id = #{orderItemId,jdbcType=BIGINT} ================================================ FILE: newbee-mall-cloud-order-service/newbee-mall-cloud-order-web/src/main/resources/mapper/NewBeeMallOrderMapper.xml ================================================ order_id, order_no, user_id, total_price, pay_status, pay_type, pay_time, order_status, extra_info, is_deleted, create_time, update_time update tb_newbee_mall_order set is_deleted=1 where order_id = #{orderId,jdbcType=BIGINT} and is_deleted=0 insert into tb_newbee_mall_order (order_id, order_no, user_id, total_price, pay_status, pay_type, pay_time, order_status, extra_info, is_deleted, create_time, update_time ) values (#{orderId,jdbcType=BIGINT}, #{orderNo,jdbcType=VARCHAR}, #{userId,jdbcType=BIGINT}, #{totalPrice,jdbcType=INTEGER}, #{payStatus,jdbcType=TINYINT}, #{payType,jdbcType=TINYINT}, #{payTime,jdbcType=TIMESTAMP}, #{orderStatus,jdbcType=TINYINT}, #{extraInfo,jdbcType=VARCHAR}, #{isDeleted,jdbcType=TINYINT}, #{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP} ) insert into tb_newbee_mall_order order_id, order_no, user_id, total_price, pay_status, pay_type, pay_time, order_status, extra_info, is_deleted, create_time, update_time, #{orderId,jdbcType=BIGINT}, #{orderNo,jdbcType=VARCHAR}, #{userId,jdbcType=BIGINT}, #{totalPrice,jdbcType=INTEGER}, #{payStatus,jdbcType=TINYINT}, #{payType,jdbcType=TINYINT}, #{payTime,jdbcType=TIMESTAMP}, #{orderStatus,jdbcType=TINYINT}, #{extraInfo,jdbcType=VARCHAR}, #{isDeleted,jdbcType=TINYINT}, #{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP}, update tb_newbee_mall_order set order_status = 2,update_time = now() where order_id in #{item} update tb_newbee_mall_order set order_status = 3,update_time = now() where order_id in #{item} update tb_newbee_mall_order set order_status = #{orderStatus},update_time = now() where order_id in #{item} update tb_newbee_mall_order order_no = #{orderNo,jdbcType=VARCHAR}, user_id = #{userId,jdbcType=BIGINT}, total_price = #{totalPrice,jdbcType=INTEGER}, pay_status = #{payStatus,jdbcType=TINYINT}, pay_type = #{payType,jdbcType=TINYINT}, pay_time = #{payTime,jdbcType=TIMESTAMP}, order_status = #{orderStatus,jdbcType=TINYINT}, extra_info = #{extraInfo,jdbcType=VARCHAR}, is_deleted = #{isDeleted,jdbcType=TINYINT}, create_time = #{createTime,jdbcType=TIMESTAMP}, update_time = #{updateTime,jdbcType=TIMESTAMP}, where order_id = #{orderId,jdbcType=BIGINT} update tb_newbee_mall_order set order_no = #{orderNo,jdbcType=VARCHAR}, user_id = #{userId,jdbcType=BIGINT}, total_price = #{totalPrice,jdbcType=INTEGER}, pay_status = #{payStatus,jdbcType=TINYINT}, pay_type = #{payType,jdbcType=TINYINT}, pay_time = #{payTime,jdbcType=TIMESTAMP}, order_status = #{orderStatus,jdbcType=TINYINT}, extra_info = #{extraInfo,jdbcType=VARCHAR}, is_deleted = #{isDeleted,jdbcType=TINYINT}, create_time = #{createTime,jdbcType=TIMESTAMP}, update_time = #{updateTime,jdbcType=TIMESTAMP} where order_id = #{orderId,jdbcType=BIGINT} ================================================ FILE: newbee-mall-cloud-order-service/pom.xml ================================================ 4.0.0 ltd.newbee.cloud newbee-mall-cloud-order-service 0.0.1-SNAPSHOT pom newbee-mall-cloud-order-service 订单模块 ltd.newbee.cloud newbee-mall-cloud 0.0.1-SNAPSHOT 1.8 newbee-mall-cloud-order-web newbee-mall-cloud-order-api ================================================ FILE: newbee-mall-cloud-recommend-service/newbee-mall-cloud-recommend-api/pom.xml ================================================ 4.0.0 ltd.recommend.newbee.cloud newbee-mall-cloud-recommend-api jar 0.0.1-SNAPSHOT newbee-mall-cloud-recommend-api 推荐服务openfeign ltd.newbee.cloud newbee-mall-cloud-recommend-service 0.0.1-SNAPSHOT 1.8 org.springframework.cloud spring-cloud-starter-openfeign ltd.newbee.cloud newbee-mall-cloud-common 0.0.1-SNAPSHOT ================================================ FILE: newbee-mall-cloud-recommend-service/newbee-mall-cloud-recommend-web/pom.xml ================================================ 4.0.0 ltd.recommend.newbee.cloud newbee-mall-cloud-recommend-web 0.0.1-SNAPSHOT newbee-mall-cloud-recommend-web 推荐服务 ltd.newbee.cloud newbee-mall-cloud-recommend-service 0.0.1-SNAPSHOT 1.8 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-test test com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery org.springframework.boot spring-boot-starter-validation org.mybatis.spring.boot mybatis-spring-boot-starter org.projectlombok lombok ${lombok.version} provided io.springfox springfox-boot-starter mysql mysql-connector-java runtime ltd.newbee.cloud newbee-mall-cloud-common 0.0.1-SNAPSHOT org.springframework.cloud spring-cloud-starter-openfeign com.alibaba.cloud spring-cloud-starter-alibaba-sentinel org.springframework.cloud spring-cloud-starter-sleuth org.springframework.cloud spring-cloud-sleuth-zipkin org.springframework.cloud spring-cloud-starter-loadbalancer net.logstash.logback logstash-logback-encoder ${logstash-logback-encoder.version} ltd.user.newbee.cloud newbee-mall-cloud-user-api 0.0.1-SNAPSHOT ltd.goods.newbee.cloud newbee-mall-cloud-goods-api 0.0.1-SNAPSHOT ================================================ FILE: newbee-mall-cloud-recommend-service/newbee-mall-cloud-recommend-web/src/main/java/ltd/recommend/cloud/newbee/NewBeeMallCloudRecommendServiceApplication.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本系统已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.recommend.cloud.newbee; import ltd.user.cloud.newbee.openfeign.NewBeeCloudUserServiceFeign; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.openfeign.EnableFeignClients; /** * @author 程序员十三 * @qq交流群 791509631 * @email 2449207463@qq.com * @link https://github.com/newbee-ltd */ @SpringBootApplication @EnableDiscoveryClient @MapperScan("ltd.recommend.cloud.newbee.dao") @EnableFeignClients(basePackageClasses = {NewBeeCloudUserServiceFeign.class, ltd.goods.cloud.newbee.openfeign.NewBeeCloudGoodsServiceFeign.class}) public class NewBeeMallCloudRecommendServiceApplication { public static void main(String[] args) { System.setProperty("nacos.logging.default.config.enabled","false"); SpringApplication.run(NewBeeMallCloudRecommendServiceApplication.class, args); } } ================================================ FILE: newbee-mall-cloud-recommend-service/newbee-mall-cloud-recommend-web/src/main/java/ltd/recommend/cloud/newbee/config/OpenFeignConfiguration.java ================================================ package ltd.recommend.cloud.newbee.config; import feign.Logger; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class OpenFeignConfiguration { @Bean public Logger.Level openFeignLogLevel() { // 设置OpenFeign日志级别 return Logger.Level.FULL; } } ================================================ FILE: newbee-mall-cloud-recommend-service/newbee-mall-cloud-recommend-web/src/main/java/ltd/recommend/cloud/newbee/config/RecommendServiceExceptionHandler.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.recommend.cloud.newbee.config; import ltd.common.cloud.newbee.enums.ServiceResultEnum; import ltd.common.cloud.newbee.dto.Result; import ltd.common.cloud.newbee.exception.NewBeeMallException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.validation.BindException; import org.springframework.validation.BindingResult; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import javax.servlet.http.HttpServletRequest; import java.util.Objects; /** * 全局异常处理 */ @RestControllerAdvice public class RecommendServiceExceptionHandler { private static final Logger log = LoggerFactory.getLogger(RecommendServiceExceptionHandler.class); @ExceptionHandler(BindException.class) public Object bindException(BindException e) { log.error("RecommendServiceExceptionHandler:",e); Result result = new Result(); result.setResultCode(510); BindingResult bindingResult = e.getBindingResult(); result.setMessage(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage()); return result; } @ExceptionHandler(MethodArgumentNotValidException.class) public Object bindException(MethodArgumentNotValidException e) { log.error("RecommendServiceExceptionHandler:",e); Result result = new Result(); result.setResultCode(510); BindingResult bindingResult = e.getBindingResult(); result.setMessage(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage()); return result; } @ExceptionHandler(Exception.class) public Object handleException(Exception e, HttpServletRequest req) { log.error("RecommendServiceExceptionHandler:",e); Result result = new Result(); result.setResultCode(500); //区分是否为自定义异常 if (e instanceof NewBeeMallException) { result.setMessage(e.getMessage()); if (e.getMessage().equals(ServiceResultEnum.ADMIN_NOT_LOGIN_ERROR.getResult()) || e.getMessage().equals(ServiceResultEnum.ADMIN_TOKEN_EXPIRE_ERROR.getResult())) { result.setResultCode(419); } } else { e.printStackTrace(); result.setMessage("未知异常,请查看控制台日志并检查配置文件。"); } return result; } } ================================================ FILE: newbee-mall-cloud-recommend-service/newbee-mall-cloud-recommend-web/src/main/java/ltd/recommend/cloud/newbee/config/RecommendServiceSwagger3Config.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.recommend.cloud.newbee.config; import ltd.common.cloud.newbee.pojo.AdminUserToken; import ltd.recommend.cloud.newbee.entity.LoginAdminUser; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.builders.RequestParameterBuilder; import springfox.documentation.oas.annotations.EnableOpenApi; import springfox.documentation.schema.ScalarType; import springfox.documentation.service.ApiInfo; import springfox.documentation.service.ParameterType; import springfox.documentation.service.RequestParameter; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket; import java.util.ArrayList; import java.util.List; @Configuration @EnableOpenApi public class RecommendServiceSwagger3Config{ @Bean public Docket api() { return new Docket(DocumentationType.OAS_30) .apiInfo(apiInfo()) .ignoredParameterTypes(AdminUserToken.class, LoginAdminUser.class) .select() .apis(RequestHandlerSelectors.basePackage("ltd.recommend.cloud.newbee.controller")) .paths(PathSelectors.any()) .build() .globalRequestParameters(getGlobalRequestParameters()); } //生成全局通用参数 private List getGlobalRequestParameters() { List parameters = new ArrayList<>(); parameters.add(new RequestParameterBuilder() .name("token") .description("登录认证token") .required(false) // 非必传 .in(ParameterType.HEADER) //请求头中的参数,其它类型可以点进ParameterType类中查看 .query(q -> q.model(m -> m.scalarModel(ScalarType.STRING))) .build()); return parameters; } private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("newbee-mall-cloud-recommend-service接口文档") .description("swagger接口文档") .version("2.0") .build(); } } ================================================ FILE: newbee-mall-cloud-recommend-service/newbee-mall-cloud-recommend-web/src/main/java/ltd/recommend/cloud/newbee/config/RecommendServiceWebMvcConfigurer.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.recommend.cloud.newbee.config; import com.alibaba.cloud.sentinel.SentinelProperties; import com.alibaba.csp.sentinel.adapter.spring.webmvc.SentinelWebInterceptor; import ltd.recommend.cloud.newbee.config.handler.TokenToAdminUserMethodArgumentResolver; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Lazy; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; import java.util.List; import java.util.Optional; @Configuration public class RecommendServiceWebMvcConfigurer extends WebMvcConfigurationSupport { private static final Logger log = LoggerFactory.getLogger(RecommendServiceWebMvcConfigurer.class); @Autowired private SentinelProperties sentinelProperties; @Autowired private Optional sentinelWebInterceptorOptional; @Autowired @Lazy private TokenToAdminUserMethodArgumentResolver tokenToAdminUserMethodArgumentResolver; /** * @param argumentResolvers * @tip @TokenToAdminUser 注解处理方法 */ public void addArgumentResolvers(List argumentResolvers) { argumentResolvers.add(tokenToAdminUserMethodArgumentResolver); } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry. addResourceHandler("/swagger-ui/**") .addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/") .resourceChain(false); } public void addInterceptors(InterceptorRegistry registry) { if (this.sentinelWebInterceptorOptional.isPresent()) { SentinelProperties.Filter filterConfig = this.sentinelProperties.getFilter(); registry.addInterceptor((HandlerInterceptor) this.sentinelWebInterceptorOptional.get()).order(filterConfig.getOrder()).addPathPatterns(filterConfig.getUrlPatterns()); log.info("[Sentinel Starter] register SentinelWebInterceptor with urlPatterns: {}.", filterConfig.getUrlPatterns()); } } } ================================================ FILE: newbee-mall-cloud-recommend-service/newbee-mall-cloud-recommend-web/src/main/java/ltd/recommend/cloud/newbee/config/annotation/TokenToAdminUser.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.recommend.cloud.newbee.config.annotation; import java.lang.annotation.*; @Target({ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface TokenToAdminUser { /** * 当前用户在request中的名字 * * @return */ String value() default "adminUser"; } ================================================ FILE: newbee-mall-cloud-recommend-service/newbee-mall-cloud-recommend-web/src/main/java/ltd/recommend/cloud/newbee/config/handler/TokenToAdminUserMethodArgumentResolver.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.recommend.cloud.newbee.config.handler; import ltd.common.cloud.newbee.enums.ServiceResultEnum; import ltd.common.cloud.newbee.dto.Result; import ltd.common.cloud.newbee.exception.NewBeeMallException; import ltd.recommend.cloud.newbee.config.annotation.TokenToAdminUser; import ltd.recommend.cloud.newbee.entity.LoginAdminUser; import ltd.user.cloud.newbee.openfeign.NewBeeCloudUserServiceFeign; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.MethodParameter; import org.springframework.stereotype.Component; import org.springframework.web.bind.support.WebDataBinderFactory; import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.method.support.ModelAndViewContainer; import java.util.LinkedHashMap; @Component public class TokenToAdminUserMethodArgumentResolver implements HandlerMethodArgumentResolver { @Autowired private NewBeeCloudUserServiceFeign newBeeCloudUserService; public TokenToAdminUserMethodArgumentResolver() { } public boolean supportsParameter(MethodParameter parameter) { if (parameter.hasParameterAnnotation(TokenToAdminUser.class)) { return true; } return false; } public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) { if (parameter.getParameterAnnotation(TokenToAdminUser.class) instanceof TokenToAdminUser) { String token = webRequest.getHeader("token"); if (null != token && !"".equals(token) && token.length() == 32) { // 通过用户中心获取用户信息 Result result = newBeeCloudUserService.getAdminUserByToken(token); if (result == null || result.getResultCode() != 200 || result.getData() == null) { NewBeeMallException.fail(ServiceResultEnum.ADMIN_NOT_LOGIN_ERROR.getResult()); } LinkedHashMap resultData = (LinkedHashMap) result.getData(); // 将返回的字段封装到LoginAdminUser对象中 LoginAdminUser loginAdminUser = new LoginAdminUser(); loginAdminUser.setAdminUserId(Long.valueOf(resultData.get("adminUserId").toString())); loginAdminUser.setLoginUserName((String) resultData.get("loginUserName")); loginAdminUser.setNickName((String) resultData.get("nickName")); loginAdminUser.setLocked(Byte.valueOf(resultData.get("locked").toString())); return loginAdminUser; } else { NewBeeMallException.fail(ServiceResultEnum.ADMIN_NOT_LOGIN_ERROR.getResult()); } } return null; } } ================================================ FILE: newbee-mall-cloud-recommend-service/newbee-mall-cloud-recommend-web/src/main/java/ltd/recommend/cloud/newbee/controller/NewBeeAdminCarouselController.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本系统已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.recommend.cloud.newbee.controller; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import ltd.common.cloud.newbee.enums.ServiceResultEnum; import ltd.common.cloud.newbee.dto.PageQueryUtil; import ltd.common.cloud.newbee.dto.Result; import ltd.common.cloud.newbee.dto.ResultGenerator; import ltd.common.cloud.newbee.util.BeanUtil; import ltd.recommend.cloud.newbee.config.annotation.TokenToAdminUser; import ltd.recommend.cloud.newbee.controller.param.BatchIdParam; import ltd.recommend.cloud.newbee.controller.param.CarouselAddParam; import ltd.recommend.cloud.newbee.controller.param.CarouselEditParam; import ltd.recommend.cloud.newbee.entity.Carousel; import ltd.recommend.cloud.newbee.entity.LoginAdminUser; import ltd.recommend.cloud.newbee.service.NewBeeMallCarouselService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.validation.Valid; import java.util.HashMap; import java.util.Map; /** * @author 13 * @qq交流群 796794009 * @email 2449207463@qq.com * @link https://github.com/newbee-ltd */ @RestController @Api(value = "v1", tags = "后台管理系统轮播图模块接口") @RequestMapping("/carousels/admin") public class NewBeeAdminCarouselController { private static final Logger logger = LoggerFactory.getLogger(NewBeeAdminCarouselController.class); @Resource NewBeeMallCarouselService newBeeMallCarouselService; /** * 列表 */ @RequestMapping(value = "/list", method = RequestMethod.GET) @ApiOperation(value = "轮播图列表", notes = "轮播图列表") public Result list(@RequestParam(required = false) @ApiParam(value = "页码") Integer pageNumber, @RequestParam(required = false) @ApiParam(value = "每页条数") Integer pageSize, @TokenToAdminUser LoginAdminUser adminUser) { logger.info("adminUser:{}", adminUser.toString()); if (pageNumber == null || pageNumber < 1 || pageSize == null || pageSize < 10) { return ResultGenerator.genFailResult("分页参数异常!"); } Map params = new HashMap(4); params.put("page", pageNumber); params.put("limit", pageSize); PageQueryUtil pageUtil = new PageQueryUtil(params); return ResultGenerator.genSuccessResult(newBeeMallCarouselService.getCarouselPage(pageUtil)); } /** * 添加 */ @RequestMapping(value = "/add", method = RequestMethod.POST) @ApiOperation(value = "新增轮播图", notes = "新增轮播图") public Result save(@RequestBody @Valid CarouselAddParam carouselAddParam, @TokenToAdminUser LoginAdminUser adminUser) { logger.info("adminUser:{}", adminUser.toString()); Carousel carousel = new Carousel(); BeanUtil.copyProperties(carouselAddParam, carousel); String result = newBeeMallCarouselService.saveCarousel(carousel); if (ServiceResultEnum.SUCCESS.getResult().equals(result)) { return ResultGenerator.genSuccessResult(); } else { return ResultGenerator.genFailResult(result); } } /** * 修改 */ @RequestMapping(value = "/update", method = RequestMethod.PUT) @ApiOperation(value = "修改轮播图信息", notes = "修改轮播图信息") public Result update(@RequestBody CarouselEditParam carouselEditParam, @TokenToAdminUser LoginAdminUser adminUser) { logger.info("adminUser:{}", adminUser.toString()); Carousel carousel = new Carousel(); BeanUtil.copyProperties(carouselEditParam, carousel); String result = newBeeMallCarouselService.updateCarousel(carousel); if (ServiceResultEnum.SUCCESS.getResult().equals(result)) { return ResultGenerator.genSuccessResult(); } else { return ResultGenerator.genFailResult(result); } } /** * 详情 */ @RequestMapping(value = "/detail/{id}", method = RequestMethod.GET) @ApiOperation(value = "获取单条轮播图信息", notes = "根据id查询") public Result info(@PathVariable("id") Integer id, @TokenToAdminUser LoginAdminUser adminUser) { logger.info("adminUser:{}", adminUser.toString()); Carousel carousel = newBeeMallCarouselService.getCarouselById(id); if (carousel == null) { return ResultGenerator.genFailResult(ServiceResultEnum.DATA_NOT_EXIST.getResult()); } return ResultGenerator.genSuccessResult(carousel); } /** * 删除 */ @RequestMapping(value = "/batchDelete", method = RequestMethod.DELETE) @ApiOperation(value = "批量删除轮播图信息", notes = "批量删除轮播图信息") public Result delete(@RequestBody BatchIdParam batchIdParam, @TokenToAdminUser LoginAdminUser adminUser) { logger.info("adminUser:{}", adminUser.toString()); if (batchIdParam == null || batchIdParam.getIds().length < 1) { return ResultGenerator.genFailResult("参数异常!"); } if (newBeeMallCarouselService.deleteBatch(batchIdParam.getIds())) { return ResultGenerator.genSuccessResult(); } else { return ResultGenerator.genFailResult("删除失败"); } } } ================================================ FILE: newbee-mall-cloud-recommend-service/newbee-mall-cloud-recommend-web/src/main/java/ltd/recommend/cloud/newbee/controller/NewBeeAdminIndexConfigController.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本系统已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.recommend.cloud.newbee.controller; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import ltd.common.cloud.newbee.enums.ServiceResultEnum; import ltd.common.cloud.newbee.dto.PageQueryUtil; import ltd.common.cloud.newbee.dto.Result; import ltd.common.cloud.newbee.dto.ResultGenerator; import ltd.common.cloud.newbee.enums.IndexConfigTypeEnum; import ltd.common.cloud.newbee.util.BeanUtil; import ltd.recommend.cloud.newbee.config.annotation.TokenToAdminUser; import ltd.recommend.cloud.newbee.controller.param.BatchIdParam; import ltd.recommend.cloud.newbee.controller.param.IndexConfigAddParam; import ltd.recommend.cloud.newbee.controller.param.IndexConfigEditParam; import ltd.recommend.cloud.newbee.entity.IndexConfig; import ltd.recommend.cloud.newbee.entity.LoginAdminUser; import ltd.recommend.cloud.newbee.service.NewBeeMallIndexConfigService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.validation.Valid; import java.util.HashMap; import java.util.Map; /** * @author 13 * @qq交流群 796794009 * @email 2449207463@qq.com * @link https://github.com/newbee-ltd */ @RestController @Api(value = "v1", tags = "后台管理系统首页配置模块接口") @RequestMapping("/indexConfigs/admin") public class NewBeeAdminIndexConfigController { private static final Logger logger = LoggerFactory.getLogger(NewBeeAdminIndexConfigController.class); @Resource private NewBeeMallIndexConfigService newBeeMallIndexConfigService; /** * 列表 */ @RequestMapping(value = "/list", method = RequestMethod.GET) @ApiOperation(value = "首页配置列表", notes = "首页配置列表") public Result list(@RequestParam(required = false) @ApiParam(value = "页码") Integer pageNumber, @RequestParam(required = false) @ApiParam(value = "每页条数") Integer pageSize, @RequestParam(required = false) @ApiParam(value = "1-搜索框热搜 2-搜索下拉框热搜 3-(首页)热销商品 4-(首页)新品上线 5-(首页)为你推荐") Integer configType, @TokenToAdminUser LoginAdminUser adminUser) { logger.info("adminUser:{}", adminUser.toString()); if (pageNumber == null || pageNumber < 1 || pageSize == null || pageSize < 10) { return ResultGenerator.genFailResult("分页参数异常!"); } IndexConfigTypeEnum indexConfigTypeEnum = IndexConfigTypeEnum.getIndexConfigTypeEnumByType(configType); if (indexConfigTypeEnum.equals(IndexConfigTypeEnum.DEFAULT)) { return ResultGenerator.genFailResult("非法参数!"); } Map params = new HashMap(8); params.put("page", pageNumber); params.put("limit", pageSize); params.put("configType", configType); PageQueryUtil pageUtil = new PageQueryUtil(params); return ResultGenerator.genSuccessResult(newBeeMallIndexConfigService.getConfigsPage(pageUtil)); } /** * 添加 */ @RequestMapping(value = "/add", method = RequestMethod.POST) @ApiOperation(value = "新增首页配置项", notes = "新增首页配置项") public Result save(@RequestBody @Valid IndexConfigAddParam indexConfigAddParam, @TokenToAdminUser LoginAdminUser adminUser) { logger.info("adminUser:{}", adminUser.toString()); IndexConfig indexConfig = new IndexConfig(); BeanUtil.copyProperties(indexConfigAddParam, indexConfig); String result = newBeeMallIndexConfigService.saveIndexConfig(indexConfig); if (ServiceResultEnum.SUCCESS.getResult().equals(result)) { return ResultGenerator.genSuccessResult(); } else { return ResultGenerator.genFailResult(result); } } /** * 修改 */ @RequestMapping(value = "/update", method = RequestMethod.PUT) @ApiOperation(value = "修改首页配置项", notes = "修改首页配置项") public Result update(@RequestBody @Valid IndexConfigEditParam indexConfigEditParam, @TokenToAdminUser LoginAdminUser adminUser) { logger.info("adminUser:{}", adminUser.toString()); IndexConfig indexConfig = new IndexConfig(); BeanUtil.copyProperties(indexConfigEditParam, indexConfig); String result = newBeeMallIndexConfigService.updateIndexConfig(indexConfig); if (ServiceResultEnum.SUCCESS.getResult().equals(result)) { return ResultGenerator.genSuccessResult(); } else { return ResultGenerator.genFailResult(result); } } /** * 详情 */ @RequestMapping(value = "/detail/{id}", method = RequestMethod.GET) @ApiOperation(value = "获取单条首页配置项信息", notes = "根据id查询") public Result info(@PathVariable("id") Long id, @TokenToAdminUser LoginAdminUser adminUser) { logger.info("adminUser:{}", adminUser.toString()); IndexConfig config = newBeeMallIndexConfigService.getIndexConfigById(id); if (config == null) { return ResultGenerator.genFailResult("未查询到数据"); } return ResultGenerator.genSuccessResult(config); } /** * 删除 */ @RequestMapping(value = "/batchDelete", method = RequestMethod.DELETE) @ApiOperation(value = "批量删除首页配置项信息", notes = "批量删除首页配置项信息") public Result delete(@RequestBody BatchIdParam batchIdParam, @TokenToAdminUser LoginAdminUser adminUser) { logger.info("adminUser:{}", adminUser.toString()); if (batchIdParam == null || batchIdParam.getIds().length < 1) { return ResultGenerator.genFailResult("参数异常!"); } if (newBeeMallIndexConfigService.deleteBatch(batchIdParam.getIds())) { return ResultGenerator.genSuccessResult(); } else { return ResultGenerator.genFailResult("删除失败"); } } } ================================================ FILE: newbee-mall-cloud-recommend-service/newbee-mall-cloud-recommend-web/src/main/java/ltd/recommend/cloud/newbee/controller/NewBeeMallIndexController.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.recommend.cloud.newbee.controller; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import ltd.common.cloud.newbee.dto.Result; import ltd.common.cloud.newbee.dto.ResultGenerator; import ltd.common.cloud.newbee.enums.IndexConfigTypeEnum; import ltd.recommend.cloud.newbee.controller.vo.IndexInfoVO; import ltd.recommend.cloud.newbee.controller.vo.NewBeeMallIndexCarouselVO; import ltd.recommend.cloud.newbee.controller.vo.NewBeeMallIndexConfigGoodsVO; import ltd.recommend.cloud.newbee.service.NewBeeMallCarouselService; import ltd.recommend.cloud.newbee.service.NewBeeMallIndexConfigService; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.util.List; @RestController @Api(value = "v1", tags = "新蜂商城首页接口") @RequestMapping("/mall/index") public class NewBeeMallIndexController { @Resource private NewBeeMallCarouselService newBeeMallCarouselService; @Resource private NewBeeMallIndexConfigService newBeeMallIndexConfigService; @GetMapping("/recommondInfos") @ApiOperation(value = "获取首页数据", notes = "轮播图、新品、推荐等") public Result indexInfo() { IndexInfoVO indexInfoVO = new IndexInfoVO(); List carousels = newBeeMallCarouselService.getCarouselsForIndex(5); List hotGoodses = newBeeMallIndexConfigService.getConfigGoodsesForIndex(IndexConfigTypeEnum.INDEX_GOODS_HOT.getType(), 4); List newGoodses = newBeeMallIndexConfigService.getConfigGoodsesForIndex(IndexConfigTypeEnum.INDEX_GOODS_NEW.getType(), 6); List recommendGoodses = newBeeMallIndexConfigService.getConfigGoodsesForIndex(IndexConfigTypeEnum.INDEX_GOODS_RECOMMOND.getType(), 10); indexInfoVO.setCarousels(carousels); indexInfoVO.setHotGoodses(hotGoodses); indexInfoVO.setNewGoodses(newGoodses); indexInfoVO.setRecommendGoodses(recommendGoodses); return ResultGenerator.genSuccessResult(indexInfoVO); } } ================================================ FILE: newbee-mall-cloud-recommend-service/newbee-mall-cloud-recommend-web/src/main/java/ltd/recommend/cloud/newbee/controller/param/BatchIdParam.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.recommend.cloud.newbee.controller.param; import lombok.Data; import java.io.Serializable; @Data public class BatchIdParam implements Serializable { //id数组 Long[] ids; } ================================================ FILE: newbee-mall-cloud-recommend-service/newbee-mall-cloud-recommend-web/src/main/java/ltd/recommend/cloud/newbee/controller/param/CarouselAddParam.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.recommend.cloud.newbee.controller.param; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.Max; import javax.validation.constraints.Min; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; @Data public class CarouselAddParam { @ApiModelProperty("轮播图URL地址") @NotEmpty(message = "轮播图URL不能为空") private String carouselUrl; @ApiModelProperty("轮播图跳转地址") @NotEmpty(message = "轮播图跳转地址不能为空") private String redirectUrl; @ApiModelProperty("排序值") @Min(value = 1, message = "carouselRank最低为1") @Max(value = 200, message = "carouselRank最高为200") @NotNull(message = "carouselRank不能为空") private Integer carouselRank; } ================================================ FILE: newbee-mall-cloud-recommend-service/newbee-mall-cloud-recommend-web/src/main/java/ltd/recommend/cloud/newbee/controller/param/CarouselEditParam.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.recommend.cloud.newbee.controller.param; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.Max; import javax.validation.constraints.Min; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; @Data public class CarouselEditParam { @ApiModelProperty("待修改轮播图id") @NotNull(message = "轮播图id不能为空") @Min(1) private Integer carouselId; @ApiModelProperty("轮播图URL地址") @NotEmpty(message = "轮播图URL不能为空") private String carouselUrl; @ApiModelProperty("轮播图跳转地址") @NotEmpty(message = "轮播图跳转地址不能为空") private String redirectUrl; @ApiModelProperty("排序值") @Min(value = 1, message = "carouselRank最低为1") @Max(value = 200, message = "carouselRank最高为200") @NotNull(message = "carouselRank不能为空") private Integer carouselRank; } ================================================ FILE: newbee-mall-cloud-recommend-service/newbee-mall-cloud-recommend-web/src/main/java/ltd/recommend/cloud/newbee/controller/param/IndexConfigAddParam.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.recommend.cloud.newbee.controller.param; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.Max; import javax.validation.constraints.Min; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; @Data public class IndexConfigAddParam { @ApiModelProperty("配置项名称") @NotEmpty(message = "configName不能为空") private String configName; @ApiModelProperty("配置类别") @NotNull(message = "configType不能为空") @Min(value = 1, message = "configType最小为1") @Max(value = 5, message = "configType最大为5") private Byte configType; @ApiModelProperty("商品id") @NotNull(message = "商品id不能为空") @Min(value = 1, message = "商品id不能为空") private Long goodsId; @ApiModelProperty("排序值") @Min(value = 1, message = "configRank最低为1") @Max(value = 200, message = "configRank最高为200") @NotNull(message = "configRank不能为空") private Integer configRank; } ================================================ FILE: newbee-mall-cloud-recommend-service/newbee-mall-cloud-recommend-web/src/main/java/ltd/recommend/cloud/newbee/controller/param/IndexConfigEditParam.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.recommend.cloud.newbee.controller.param; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.Max; import javax.validation.constraints.Min; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; @Data public class IndexConfigEditParam { @ApiModelProperty("待修改配置id") @NotNull(message = "configId不能为空") @Min(value = 1, message = "configId不能为空") private Long configId; @ApiModelProperty("配置的名称") @NotEmpty(message = "configName不能为空") private String configName; @ApiModelProperty("配置类别") @NotNull(message = "configType不能为空") @Min(value = 1, message = "configType最小为1") @Max(value = 5, message = "configType最大为5") private Byte configType; @ApiModelProperty("商品id") @NotNull(message = "商品id不能为空") @Min(value = 1, message = "商品id不能为空") private Long goodsId; @ApiModelProperty("排序值") @Min(value = 1, message = "configRank最低为1") @Max(value = 200, message = "configRank最高为200") @NotNull(message = "configRank不能为空") private Integer configRank; } ================================================ FILE: newbee-mall-cloud-recommend-service/newbee-mall-cloud-recommend-web/src/main/java/ltd/recommend/cloud/newbee/controller/vo/IndexInfoVO.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.recommend.cloud.newbee.controller.vo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; import java.util.List; @Data public class IndexInfoVO implements Serializable { @ApiModelProperty("轮播图(列表)") private List carousels; @ApiModelProperty("首页热销商品(列表)") private List hotGoodses; @ApiModelProperty("首页新品推荐(列表)") private List newGoodses; @ApiModelProperty("首页推荐商品(列表)") private List recommendGoodses; } ================================================ FILE: newbee-mall-cloud-recommend-service/newbee-mall-cloud-recommend-web/src/main/java/ltd/recommend/cloud/newbee/controller/vo/NewBeeMallIndexCarouselVO.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.recommend.cloud.newbee.controller.vo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; /** * 首页轮播图VO */ @Data public class NewBeeMallIndexCarouselVO implements Serializable { @ApiModelProperty("轮播图图片地址") private String carouselUrl; @ApiModelProperty("轮播图点击后的跳转路径") private String redirectUrl; } ================================================ FILE: newbee-mall-cloud-recommend-service/newbee-mall-cloud-recommend-web/src/main/java/ltd/recommend/cloud/newbee/controller/vo/NewBeeMallIndexCategoryVO.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.recommend.cloud.newbee.controller.vo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; import java.util.List; /** * 首页分类数据VO */ @Data public class NewBeeMallIndexCategoryVO implements Serializable { @ApiModelProperty("当前一级分类id") private Long categoryId; @ApiModelProperty("当前分类级别") private Byte categoryLevel; @ApiModelProperty("当前一级分类名称") private String categoryName; @ApiModelProperty("二级分类列表") private List secondLevelCategoryVOS; } ================================================ FILE: newbee-mall-cloud-recommend-service/newbee-mall-cloud-recommend-web/src/main/java/ltd/recommend/cloud/newbee/controller/vo/NewBeeMallIndexConfigGoodsVO.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.recommend.cloud.newbee.controller.vo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; /** * 首页配置商品VO */ @Data public class NewBeeMallIndexConfigGoodsVO implements Serializable { @ApiModelProperty("商品id") private Long goodsId; @ApiModelProperty("商品名称") private String goodsName; @ApiModelProperty("商品简介") private String goodsIntro; @ApiModelProperty("商品图片地址") private String goodsCoverImg; @ApiModelProperty("商品价格") private Integer sellingPrice; @ApiModelProperty("商品标签") private String tag; } ================================================ FILE: newbee-mall-cloud-recommend-service/newbee-mall-cloud-recommend-web/src/main/java/ltd/recommend/cloud/newbee/controller/vo/SecondLevelCategoryVO.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.recommend.cloud.newbee.controller.vo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; import java.util.List; /** * 首页分类数据VO(第二级) */ @Data public class SecondLevelCategoryVO implements Serializable { @ApiModelProperty("当前二级分类id") private Long categoryId; @ApiModelProperty("父级分类id") private Long parentId; @ApiModelProperty("当前分类级别") private Byte categoryLevel; @ApiModelProperty("当前二级分类名称") private String categoryName; @ApiModelProperty("三级分类列表") private List thirdLevelCategoryVOS; } ================================================ FILE: newbee-mall-cloud-recommend-service/newbee-mall-cloud-recommend-web/src/main/java/ltd/recommend/cloud/newbee/controller/vo/ThirdLevelCategoryVO.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.recommend.cloud.newbee.controller.vo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; /** * 首页分类数据VO(第三级) */ @Data public class ThirdLevelCategoryVO implements Serializable { @ApiModelProperty("当前三级分类id") private Long categoryId; @ApiModelProperty("当前分类级别") private Byte categoryLevel; @ApiModelProperty("当前三级分类名称") private String categoryName; } ================================================ FILE: newbee-mall-cloud-recommend-service/newbee-mall-cloud-recommend-web/src/main/java/ltd/recommend/cloud/newbee/dao/CarouselMapper.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.recommend.cloud.newbee.dao; import ltd.common.cloud.newbee.dto.PageQueryUtil; import ltd.recommend.cloud.newbee.entity.Carousel; import org.apache.ibatis.annotations.Param; import java.util.List; public interface CarouselMapper { int deleteByPrimaryKey(Integer carouselId); int insert(Carousel record); int insertSelective(Carousel record); Carousel selectByPrimaryKey(Integer carouselId); int updateByPrimaryKeySelective(Carousel record); int updateByPrimaryKey(Carousel record); List findCarouselList(PageQueryUtil pageUtil); int getTotalCarousels(PageQueryUtil pageUtil); int deleteBatch(Long[] ids); List findCarouselsByNum(@Param("number") int number); } ================================================ FILE: newbee-mall-cloud-recommend-service/newbee-mall-cloud-recommend-web/src/main/java/ltd/recommend/cloud/newbee/dao/IndexConfigMapper.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.recommend.cloud.newbee.dao; import ltd.common.cloud.newbee.dto.PageQueryUtil; import ltd.recommend.cloud.newbee.entity.IndexConfig; import org.apache.ibatis.annotations.Param; import java.util.List; public interface IndexConfigMapper { int deleteByPrimaryKey(Long configId); int insert(IndexConfig record); int insertSelective(IndexConfig record); IndexConfig selectByPrimaryKey(Long configId); IndexConfig selectByTypeAndGoodsId(@Param("configType") int configType, @Param("goodsId") Long goodsId); int updateByPrimaryKeySelective(IndexConfig record); int updateByPrimaryKey(IndexConfig record); List findIndexConfigList(PageQueryUtil pageUtil); int getTotalIndexConfigs(PageQueryUtil pageUtil); int deleteBatch(Long[] ids); List findIndexConfigsByTypeAndNum(@Param("configType") int configType, @Param("number") int number); } ================================================ FILE: newbee-mall-cloud-recommend-service/newbee-mall-cloud-recommend-web/src/main/java/ltd/recommend/cloud/newbee/entity/Carousel.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.recommend.cloud.newbee.entity; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import java.util.Date; @Data public class Carousel { private Integer carouselId; private String carouselUrl; private String redirectUrl; private Integer carouselRank; private Byte isDeleted; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date createTime; private Integer createUser; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date updateTime; private Integer updateUser; } ================================================ FILE: newbee-mall-cloud-recommend-service/newbee-mall-cloud-recommend-web/src/main/java/ltd/recommend/cloud/newbee/entity/IndexConfig.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.recommend.cloud.newbee.entity; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import java.util.Date; @Data public class IndexConfig { private Long configId; private String configName; private Byte configType; private Long goodsId; private String redirectUrl; private Integer configRank; private Byte isDeleted; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date createTime; private Integer createUser; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date updateTime; private Integer updateUser; } ================================================ FILE: newbee-mall-cloud-recommend-service/newbee-mall-cloud-recommend-web/src/main/java/ltd/recommend/cloud/newbee/entity/LoginAdminUser.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本系统已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.recommend.cloud.newbee.entity; import lombok.Data; @Data public class LoginAdminUser { private Long adminUserId; private String loginUserName; private String loginPassword; private String nickName; private Byte locked; } ================================================ FILE: newbee-mall-cloud-recommend-service/newbee-mall-cloud-recommend-web/src/main/java/ltd/recommend/cloud/newbee/service/NewBeeMallCarouselService.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.recommend.cloud.newbee.service; import ltd.common.cloud.newbee.dto.PageQueryUtil; import ltd.common.cloud.newbee.dto.PageResult; import ltd.recommend.cloud.newbee.controller.vo.NewBeeMallIndexCarouselVO; import ltd.recommend.cloud.newbee.entity.Carousel; import java.util.List; public interface NewBeeMallCarouselService { /** * 后台分页 * * @param pageUtil * @return */ PageResult getCarouselPage(PageQueryUtil pageUtil); String saveCarousel(Carousel carousel); String updateCarousel(Carousel carousel); Carousel getCarouselById(Integer id); Boolean deleteBatch(Long[] ids); /** * 返回固定数量的轮播图对象(首页调用) * * @param number * @return */ List getCarouselsForIndex(int number); } ================================================ FILE: newbee-mall-cloud-recommend-service/newbee-mall-cloud-recommend-web/src/main/java/ltd/recommend/cloud/newbee/service/NewBeeMallIndexConfigService.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.recommend.cloud.newbee.service; import ltd.common.cloud.newbee.dto.PageQueryUtil; import ltd.common.cloud.newbee.dto.PageResult; import ltd.recommend.cloud.newbee.controller.vo.NewBeeMallIndexConfigGoodsVO; import ltd.recommend.cloud.newbee.entity.IndexConfig; import java.util.List; public interface NewBeeMallIndexConfigService { /** * 后台分页 * * @param pageUtil * @return */ PageResult getConfigsPage(PageQueryUtil pageUtil); String saveIndexConfig(IndexConfig indexConfig); String updateIndexConfig(IndexConfig indexConfig); IndexConfig getIndexConfigById(Long id); Boolean deleteBatch(Long[] ids); /** * 返回固定数量的首页配置商品对象(首页调用) * * @param number * @return */ List getConfigGoodsesForIndex(int configType, int number); } ================================================ FILE: newbee-mall-cloud-recommend-service/newbee-mall-cloud-recommend-web/src/main/java/ltd/recommend/cloud/newbee/service/impl/NewBeeMallCarouselServiceImpl.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.recommend.cloud.newbee.service.impl; import ltd.common.cloud.newbee.enums.ServiceResultEnum; import ltd.common.cloud.newbee.dto.PageQueryUtil; import ltd.common.cloud.newbee.dto.PageResult; import ltd.common.cloud.newbee.util.BeanUtil; import ltd.recommend.cloud.newbee.controller.vo.NewBeeMallIndexCarouselVO; import ltd.recommend.cloud.newbee.dao.CarouselMapper; import ltd.recommend.cloud.newbee.entity.Carousel; import ltd.recommend.cloud.newbee.service.NewBeeMallCarouselService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.util.ArrayList; import java.util.Date; import java.util.List; @Service public class NewBeeMallCarouselServiceImpl implements NewBeeMallCarouselService { @Autowired private CarouselMapper carouselMapper; @Override public PageResult getCarouselPage(PageQueryUtil pageUtil) { List carousels = carouselMapper.findCarouselList(pageUtil); int total = carouselMapper.getTotalCarousels(pageUtil); PageResult pageResult = new PageResult(carousels, total, pageUtil.getLimit(), pageUtil.getPage()); return pageResult; } @Override public String saveCarousel(Carousel carousel) { if (carouselMapper.insertSelective(carousel) > 0) { return ServiceResultEnum.SUCCESS.getResult(); } return ServiceResultEnum.DB_ERROR.getResult(); } @Override public String updateCarousel(Carousel carousel) { Carousel temp = carouselMapper.selectByPrimaryKey(carousel.getCarouselId()); if (temp == null) { return ServiceResultEnum.DATA_NOT_EXIST.getResult(); } temp.setCarouselRank(carousel.getCarouselRank()); temp.setRedirectUrl(carousel.getRedirectUrl()); temp.setCarouselUrl(carousel.getCarouselUrl()); temp.setUpdateTime(new Date()); if (carouselMapper.updateByPrimaryKeySelective(temp) > 0) { return ServiceResultEnum.SUCCESS.getResult(); } return ServiceResultEnum.DB_ERROR.getResult(); } @Override public Carousel getCarouselById(Integer id) { return carouselMapper.selectByPrimaryKey(id); } @Override public Boolean deleteBatch(Long[] ids) { if (ids.length < 1) { return false; } //删除数据 return carouselMapper.deleteBatch(ids) > 0; } @Override public List getCarouselsForIndex(int number) { List newBeeMallIndexCarouselVOS = new ArrayList<>(number); List carousels = carouselMapper.findCarouselsByNum(number); if (!CollectionUtils.isEmpty(carousels)) { newBeeMallIndexCarouselVOS = BeanUtil.copyList(carousels, NewBeeMallIndexCarouselVO.class); } return newBeeMallIndexCarouselVOS; } } ================================================ FILE: newbee-mall-cloud-recommend-service/newbee-mall-cloud-recommend-web/src/main/java/ltd/recommend/cloud/newbee/service/impl/NewBeeMallIndexConfigServiceImpl.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.recommend.cloud.newbee.service.impl; import ltd.common.cloud.newbee.enums.ServiceResultEnum; import ltd.common.cloud.newbee.dto.PageQueryUtil; import ltd.common.cloud.newbee.dto.PageResult; import ltd.common.cloud.newbee.dto.Result; import ltd.common.cloud.newbee.util.BeanUtil; import ltd.goods.cloud.newbee.dto.NewBeeMallGoodsDTO; import ltd.goods.cloud.newbee.openfeign.NewBeeCloudGoodsServiceFeign; import ltd.recommend.cloud.newbee.controller.vo.NewBeeMallIndexConfigGoodsVO; import ltd.recommend.cloud.newbee.dao.IndexConfigMapper; import ltd.recommend.cloud.newbee.entity.IndexConfig; import ltd.recommend.cloud.newbee.service.NewBeeMallIndexConfigService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.stream.Collectors; @Service public class NewBeeMallIndexConfigServiceImpl implements NewBeeMallIndexConfigService { @Autowired private IndexConfigMapper indexConfigMapper; @Autowired private NewBeeCloudGoodsServiceFeign goodsService; @Override public PageResult getConfigsPage(PageQueryUtil pageUtil) { List indexConfigs = indexConfigMapper.findIndexConfigList(pageUtil); int total = indexConfigMapper.getTotalIndexConfigs(pageUtil); PageResult pageResult = new PageResult(indexConfigs, total, pageUtil.getLimit(), pageUtil.getPage()); return pageResult; } @Override public String saveIndexConfig(IndexConfig indexConfig) { Result goodsDetailResult = goodsService.getGoodsDetail(indexConfig.getGoodsId()); if (goodsDetailResult == null || goodsDetailResult.getResultCode() != 200) { return ServiceResultEnum.GOODS_NOT_EXIST.getResult(); } if (indexConfigMapper.selectByTypeAndGoodsId(indexConfig.getConfigType(), indexConfig.getGoodsId()) != null) { return ServiceResultEnum.SAME_INDEX_CONFIG_EXIST.getResult(); } if (indexConfigMapper.insertSelective(indexConfig) > 0) { return ServiceResultEnum.SUCCESS.getResult(); } return ServiceResultEnum.DB_ERROR.getResult(); } @Override public String updateIndexConfig(IndexConfig indexConfig) { Result goodsDetailResult = goodsService.getGoodsDetail(indexConfig.getGoodsId()); if (goodsDetailResult == null || goodsDetailResult.getResultCode() != 200) { return ServiceResultEnum.GOODS_NOT_EXIST.getResult(); } IndexConfig temp = indexConfigMapper.selectByPrimaryKey(indexConfig.getConfigId()); if (temp == null) { return ServiceResultEnum.DATA_NOT_EXIST.getResult(); } IndexConfig temp2 = indexConfigMapper.selectByTypeAndGoodsId(indexConfig.getConfigType(), indexConfig.getGoodsId()); if (temp2 != null && !temp2.getConfigId().equals(indexConfig.getConfigId())) { //goodsId相同且不同id 不能继续修改 return ServiceResultEnum.SAME_INDEX_CONFIG_EXIST.getResult(); } indexConfig.setUpdateTime(new Date()); if (indexConfigMapper.updateByPrimaryKeySelective(indexConfig) > 0) { return ServiceResultEnum.SUCCESS.getResult(); } return ServiceResultEnum.DB_ERROR.getResult(); } @Override public IndexConfig getIndexConfigById(Long id) { return indexConfigMapper.selectByPrimaryKey(id); } @Override public Boolean deleteBatch(Long[] ids) { if (ids.length < 1) { return false; } //删除数据 return indexConfigMapper.deleteBatch(ids) > 0; } @Override public List getConfigGoodsesForIndex(int configType, int number) { List newBeeMallIndexConfigGoodsVOS = new ArrayList<>(number); List indexConfigs = indexConfigMapper.findIndexConfigsByTypeAndNum(configType, number); if (!CollectionUtils.isEmpty(indexConfigs)) { //取出所有的goodsId List goodsIds = indexConfigs.stream().map(IndexConfig::getGoodsId).collect(Collectors.toList()); Result> newBeeMallGoodsDTOResult = goodsService.listByGoodsIds(goodsIds); newBeeMallIndexConfigGoodsVOS = BeanUtil.copyList(newBeeMallGoodsDTOResult.getData(), NewBeeMallIndexConfigGoodsVO.class); for (NewBeeMallIndexConfigGoodsVO newBeeMallIndexConfigGoodsVO : newBeeMallIndexConfigGoodsVOS) { String goodsName = newBeeMallIndexConfigGoodsVO.getGoodsName(); String goodsIntro = newBeeMallIndexConfigGoodsVO.getGoodsIntro(); // 字符串过长导致文字超出的问题 if (goodsName.length() > 30) { goodsName = goodsName.substring(0, 30) + "..."; newBeeMallIndexConfigGoodsVO.setGoodsName(goodsName); } if (goodsIntro.length() > 22) { goodsIntro = goodsIntro.substring(0, 22) + "..."; newBeeMallIndexConfigGoodsVO.setGoodsIntro(goodsIntro); } } } return newBeeMallIndexConfigGoodsVOS; } } ================================================ FILE: newbee-mall-cloud-recommend-service/newbee-mall-cloud-recommend-web/src/main/resources/application.properties ================================================ server.port=29020 # 服务名称 spring.application.name=newbee-mall-cloud-recommend-service # Nacos地址 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 # Nacos登录用户名(默认为nacos,生产环境一定要修改) spring.cloud.nacos.username=nacos # Nacos登录密码(默认为nacos,生产环境一定要修改) spring.cloud.nacos.password=nacos # datasource config (MySQL) spring.datasource.name=newbee-mall-cloud-recommend-datasource spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/newbee_mall_cloud_recommend_db?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=utf8&autoReconnect=true&useSSL=false spring.datasource.username=root spring.datasource.password=123456 spring.datasource.hikari.minimum-idle=5 spring.datasource.hikari.maximum-pool-size=15 spring.datasource.hikari.auto-commit=true spring.datasource.hikari.idle-timeout=60000 spring.datasource.hikari.pool-name=hikariCP spring.datasource.hikari.max-lifetime=600000 spring.datasource.hikari.connection-timeout=30000 spring.datasource.hikari.connection-test-query=SELECT 1 # mybatis config mybatis.mapper-locations=classpath:mapper/*Mapper.xml # openfeign config feign.client.config.default.connectTimeout=2000 feign.client.config.default.readTimeout=5000 feign.compression.request.enabled=true feign.compression.request.mime-types=text/xml,application/xml,application/json feign.compression.request.min-request-size=1024 feign.compression.response.enabled=true # 演示需要,开启OpenFeign和当前项目中的DEBUG级别日志 #logging.level.ltd.user.cloud.newbee.openfeign=debug #logging.level.ltd.goods.cloud.newbee.openfeign=debug #logging.level.ltd.recommend.cloud.newbee=debug # sentinel config spring.cloud.sentinel.transport.port=8920 spring.cloud.sentinel.transport.clientIp=127.0.0.1 # 指定Sentinel控制台地址 spring.cloud.sentinel.transport.dashboard=127.0.0.1:9113 # Sleuth采样率,取值范围为[0.1,1.0],值越大收集越及时,但性能影响也越大 spring.sleuth.sampler.probability=1.0 # 每秒数据采集量,最多n条/秒Trace spring.sleuth.sampler.rate=500 spring.zipkin.base-url=http://localhost:9411 ================================================ FILE: newbee-mall-cloud-recommend-service/newbee-mall-cloud-recommend-web/src/main/resources/logback.xml ================================================ ${APP_NAME} INFO ${CONSOLE_LOG_PATTERN} utf8 192.168.110.57:4560 INFO ================================================ FILE: newbee-mall-cloud-recommend-service/newbee-mall-cloud-recommend-web/src/main/resources/mapper/CarouselMapper.xml ================================================ carousel_id, carousel_url, redirect_url, carousel_rank, is_deleted, create_time, create_user, update_time, update_user delete from tb_newbee_mall_carousel where carousel_id = #{carouselId,jdbcType=INTEGER} insert into tb_newbee_mall_carousel (carousel_id, carousel_url, redirect_url, carousel_rank, is_deleted, create_time, create_user, update_time, update_user ) values (#{carouselId,jdbcType=INTEGER}, #{carouselUrl,jdbcType=VARCHAR}, #{redirectUrl,jdbcType=VARCHAR}, #{carouselRank,jdbcType=INTEGER}, #{isDeleted,jdbcType=TINYINT}, #{createTime,jdbcType=TIMESTAMP}, #{createUser,jdbcType=INTEGER}, #{updateTime,jdbcType=TIMESTAMP}, #{updateUser,jdbcType=INTEGER} ) insert into tb_newbee_mall_carousel carousel_id, carousel_url, redirect_url, carousel_rank, is_deleted, create_time, create_user, update_time, update_user, #{carouselId,jdbcType=INTEGER}, #{carouselUrl,jdbcType=VARCHAR}, #{redirectUrl,jdbcType=VARCHAR}, #{carouselRank,jdbcType=INTEGER}, #{isDeleted,jdbcType=TINYINT}, #{createTime,jdbcType=TIMESTAMP}, #{createUser,jdbcType=INTEGER}, #{updateTime,jdbcType=TIMESTAMP}, #{updateUser,jdbcType=INTEGER}, update tb_newbee_mall_carousel carousel_url = #{carouselUrl,jdbcType=VARCHAR}, redirect_url = #{redirectUrl,jdbcType=VARCHAR}, carousel_rank = #{carouselRank,jdbcType=INTEGER}, is_deleted = #{isDeleted,jdbcType=TINYINT}, create_time = #{createTime,jdbcType=TIMESTAMP}, create_user = #{createUser,jdbcType=INTEGER}, update_time = #{updateTime,jdbcType=TIMESTAMP}, update_user = #{updateUser,jdbcType=INTEGER}, where carousel_id = #{carouselId,jdbcType=INTEGER} update tb_newbee_mall_carousel set carousel_url = #{carouselUrl,jdbcType=VARCHAR}, redirect_url = #{redirectUrl,jdbcType=VARCHAR}, carousel_rank = #{carouselRank,jdbcType=INTEGER}, is_deleted = #{isDeleted,jdbcType=TINYINT}, create_time = #{createTime,jdbcType=TIMESTAMP}, create_user = #{createUser,jdbcType=INTEGER}, update_time = #{updateTime,jdbcType=TIMESTAMP}, update_user = #{updateUser,jdbcType=INTEGER} where carousel_id = #{carouselId,jdbcType=INTEGER} update tb_newbee_mall_carousel set is_deleted=1,update_time=now() where carousel_id in #{id} ================================================ FILE: newbee-mall-cloud-recommend-service/newbee-mall-cloud-recommend-web/src/main/resources/mapper/IndexConfigMapper.xml ================================================ config_id, config_name, config_type, goods_id, redirect_url, config_rank, is_deleted, create_time, create_user, update_time, update_user update tb_newbee_mall_index_config set is_deleted=1 where config_id = #{configId,jdbcType=BIGINT} and is_deleted=0 update tb_newbee_mall_index_config set is_deleted=1,update_time=now() where is_deleted=0 and config_id in #{id} insert into tb_newbee_mall_index_config (config_id, config_name, config_type, goods_id, redirect_url, config_rank, is_deleted, create_time, create_user, update_time, update_user) values (#{configId,jdbcType=BIGINT}, #{configName,jdbcType=VARCHAR}, #{configType,jdbcType=TINYINT}, #{goodsId,jdbcType=BIGINT}, #{redirectUrl,jdbcType=VARCHAR}, #{configRank,jdbcType=INTEGER}, #{isDeleted,jdbcType=TINYINT}, #{createTime,jdbcType=TIMESTAMP}, #{createUser,jdbcType=INTEGER}, #{updateTime,jdbcType=TIMESTAMP}, #{updateUser,jdbcType=INTEGER}) insert into tb_newbee_mall_index_config config_id, config_name, config_type, goods_id, redirect_url, config_rank, is_deleted, create_time, create_user, update_time, update_user, #{configId,jdbcType=BIGINT}, #{configName,jdbcType=VARCHAR}, #{configType,jdbcType=TINYINT}, #{goodsId,jdbcType=BIGINT}, #{redirectUrl,jdbcType=VARCHAR}, #{configRank,jdbcType=INTEGER}, #{isDeleted,jdbcType=TINYINT}, #{createTime,jdbcType=TIMESTAMP}, #{createUser,jdbcType=INTEGER}, #{updateTime,jdbcType=TIMESTAMP}, #{updateUser,jdbcType=INTEGER}, update tb_newbee_mall_index_config config_name = #{configName,jdbcType=VARCHAR}, config_type = #{configType,jdbcType=TINYINT}, goods_id = #{goodsId,jdbcType=BIGINT}, redirect_url = #{redirectUrl,jdbcType=VARCHAR}, config_rank = #{configRank,jdbcType=INTEGER}, is_deleted = #{isDeleted,jdbcType=TINYINT}, create_time = #{createTime,jdbcType=TIMESTAMP}, create_user = #{createUser,jdbcType=INTEGER}, update_time = #{updateTime,jdbcType=TIMESTAMP}, update_user = #{updateUser,jdbcType=INTEGER}, where config_id = #{configId,jdbcType=BIGINT} update tb_newbee_mall_index_config set config_name = #{configName,jdbcType=VARCHAR}, config_type = #{configType,jdbcType=TINYINT}, goods_id = #{goodsId,jdbcType=BIGINT}, redirect_url = #{redirectUrl,jdbcType=VARCHAR}, config_rank = #{configRank,jdbcType=INTEGER}, is_deleted = #{isDeleted,jdbcType=TINYINT}, create_time = #{createTime,jdbcType=TIMESTAMP}, create_user = #{createUser,jdbcType=INTEGER}, update_time = #{updateTime,jdbcType=TIMESTAMP}, update_user = #{updateUser,jdbcType=INTEGER} where config_id = #{configId,jdbcType=BIGINT} ================================================ FILE: newbee-mall-cloud-recommend-service/pom.xml ================================================ 4.0.0 ltd.newbee.cloud newbee-mall-cloud-recommend-service 0.0.1-SNAPSHOT pom newbee-mall-cloud-recommend-service 推荐模块 ltd.newbee.cloud newbee-mall-cloud 0.0.1-SNAPSHOT 1.8 newbee-mall-cloud-recommend-web newbee-mall-cloud-recommend-api ================================================ FILE: newbee-mall-cloud-shop-cart-service/newbee-mall-cloud-shop-cart-api/pom.xml ================================================ 4.0.0 ltd.shopcart.newbee.cloud newbee-mall-cloud-shop-cart-api jar 0.0.1-SNAPSHOT newbee-mall-cloud-shop-cart-api 购物车服务openfeign ltd.newbee.cloud newbee-mall-cloud-shop-cart-service 0.0.1-SNAPSHOT 1.8 org.springframework.cloud spring-cloud-starter-openfeign ltd.newbee.cloud newbee-mall-cloud-common 0.0.1-SNAPSHOT ================================================ FILE: newbee-mall-cloud-shop-cart-service/newbee-mall-cloud-shop-cart-api/src/main/java/ltd/shopcart/cloud/newbee/dto/NewBeeMallShoppingCartItemDTO.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.shopcart.cloud.newbee.dto; import java.io.Serializable; public class NewBeeMallShoppingCartItemDTO implements Serializable { private Long cartItemId; private Long userId; private Long goodsId; private Integer goodsCount; public Long getCartItemId() { return cartItemId; } public void setCartItemId(Long cartItemId) { this.cartItemId = cartItemId; } public Long getUserId() { return userId; } public void setUserId(Long userId) { this.userId = userId; } public Long getGoodsId() { return goodsId; } public void setGoodsId(Long goodsId) { this.goodsId = goodsId; } public Integer getGoodsCount() { return goodsCount; } public void setGoodsCount(Integer goodsCount) { this.goodsCount = goodsCount; } } ================================================ FILE: newbee-mall-cloud-shop-cart-service/newbee-mall-cloud-shop-cart-api/src/main/java/ltd/shopcart/cloud/newbee/openfeign/NewBeeCloudShopCartServiceFeign.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本系统已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.shopcart.cloud.newbee.openfeign; import ltd.common.cloud.newbee.dto.Result; import ltd.shopcart.cloud.newbee.dto.NewBeeMallShoppingCartItemDTO; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import java.util.List; @FeignClient(value = "newbee-mall-cloud-shop-cart-service", path = "/shop-cart") public interface NewBeeCloudShopCartServiceFeign { @GetMapping(value = "/listByCartItemIds") Result> listByCartItemIds(@RequestParam(value = "cartItemIds") List cartItemIds); @DeleteMapping(value = "/deleteByCartItemIds") Result deleteByCartItemIds(@RequestParam(value = "cartItemIds") List cartItemIds); } ================================================ FILE: newbee-mall-cloud-shop-cart-service/newbee-mall-cloud-shop-cart-web/pom.xml ================================================ 4.0.0 ltd.shopcart.newbee.cloud newbee-mall-cloud-shop-cart-web 0.0.1-SNAPSHOT newbee-mall-cloud-shop-cart-web 购物车服务 ltd.newbee.cloud newbee-mall-cloud-shop-cart-service 0.0.1-SNAPSHOT 1.8 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-test test com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery org.springframework.boot spring-boot-starter-validation org.mybatis.spring.boot mybatis-spring-boot-starter com.alibaba.cloud spring-cloud-starter-alibaba-seata org.projectlombok lombok ${lombok.version} provided io.springfox springfox-boot-starter mysql mysql-connector-java runtime ltd.newbee.cloud newbee-mall-cloud-common 0.0.1-SNAPSHOT org.springframework.cloud spring-cloud-starter-openfeign org.springframework.cloud spring-cloud-starter-loadbalancer com.alibaba.cloud spring-cloud-starter-alibaba-sentinel org.springframework.cloud spring-cloud-starter-sleuth org.springframework.cloud spring-cloud-sleuth-zipkin net.logstash.logback logstash-logback-encoder ${logstash-logback-encoder.version} ltd.user.newbee.cloud newbee-mall-cloud-user-api 0.0.1-SNAPSHOT ltd.goods.newbee.cloud newbee-mall-cloud-goods-api 0.0.1-SNAPSHOT ================================================ FILE: newbee-mall-cloud-shop-cart-service/newbee-mall-cloud-shop-cart-web/src/main/java/ltd/shopcart/cloud/newbee/NewBeeMallCloudShopCartServiceApplication.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本系统已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.shopcart.cloud.newbee; import ltd.goods.cloud.newbee.openfeign.NewBeeCloudGoodsServiceFeign; import ltd.user.cloud.newbee.openfeign.NewBeeCloudUserServiceFeign; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.openfeign.EnableFeignClients; /** * @author 程序员十三 * @qq交流群 791509631 * @email 2449207463@qq.com * @link https://github.com/newbee-ltd */ @SpringBootApplication @EnableDiscoveryClient @MapperScan("ltd.shopcart.cloud.newbee.dao") @EnableFeignClients(basePackageClasses ={NewBeeCloudUserServiceFeign.class, NewBeeCloudGoodsServiceFeign.class}) public class NewBeeMallCloudShopCartServiceApplication { public static void main(String[] args) { System.setProperty("nacos.logging.default.config.enabled","false"); SpringApplication.run(NewBeeMallCloudShopCartServiceApplication.class, args); } } ================================================ FILE: newbee-mall-cloud-shop-cart-service/newbee-mall-cloud-shop-cart-web/src/main/java/ltd/shopcart/cloud/newbee/config/OpenFeignConfiguration.java ================================================ package ltd.shopcart.cloud.newbee.config; import feign.Logger; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class OpenFeignConfiguration { @Bean public Logger.Level openFeignLogLevel() { // 设置OpenFeign日志级别 return Logger.Level.FULL; } } ================================================ FILE: newbee-mall-cloud-shop-cart-service/newbee-mall-cloud-shop-cart-web/src/main/java/ltd/shopcart/cloud/newbee/config/SeataProxyConfiguration.java ================================================ package ltd.shopcart.cloud.newbee.config; import com.alibaba.druid.pool.DruidDataSource; import io.seata.rm.datasource.DataSourceProxy; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import javax.annotation.PostConstruct; import javax.sql.DataSource; @Configuration public class SeataProxyConfiguration { //创建Druid数据源 @Bean @ConfigurationProperties(prefix = "spring.datasource") public DruidDataSource druidDataSource() { return new DruidDataSource(); } //创建DataSource数据源代理 @Bean("dataSource") @Primary public DataSource dataSourceDelegation(DruidDataSource druidDataSource) { return new DataSourceProxy(druidDataSource); } /* * 解决druid 日志报错:discard long time none received connection:xxx * */ @PostConstruct public void setProperties(){ System.setProperty("druid.mysql.usePingMethod","false"); } } ================================================ FILE: newbee-mall-cloud-shop-cart-service/newbee-mall-cloud-shop-cart-web/src/main/java/ltd/shopcart/cloud/newbee/config/ShopCartServiceExceptionHandler.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.shopcart.cloud.newbee.config; import ltd.common.cloud.newbee.enums.ServiceResultEnum; import ltd.common.cloud.newbee.dto.Result; import ltd.common.cloud.newbee.exception.NewBeeMallException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.validation.BindException; import org.springframework.validation.BindingResult; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import javax.servlet.http.HttpServletRequest; import java.util.Objects; /** * 全局异常处理 */ @RestControllerAdvice public class ShopCartServiceExceptionHandler { private static final Logger log = LoggerFactory.getLogger(ShopCartServiceExceptionHandler.class); @ExceptionHandler(BindException.class) public Object bindException(BindException e) { log.error("ShopCartServiceExceptionHandler:",e); Result result = new Result(); result.setResultCode(510); BindingResult bindingResult = e.getBindingResult(); result.setMessage(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage()); return result; } @ExceptionHandler(MethodArgumentNotValidException.class) public Object bindException(MethodArgumentNotValidException e) { log.error("ShopCartServiceExceptionHandler:",e); Result result = new Result(); result.setResultCode(510); BindingResult bindingResult = e.getBindingResult(); result.setMessage(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage()); return result; } @ExceptionHandler(Exception.class) public Object handleException(Exception e, HttpServletRequest req) { log.error("ShopCartServiceExceptionHandler:",e); Result result = new Result(); result.setResultCode(500); //区分是否为自定义异常 if (e instanceof NewBeeMallException) { result.setMessage(e.getMessage()); if (e.getMessage().equals(ServiceResultEnum.NOT_LOGIN_ERROR.getResult()) || e.getMessage().equals(ServiceResultEnum.TOKEN_EXPIRE_ERROR.getResult())) { result.setResultCode(416); } } else { e.printStackTrace(); result.setMessage("未知异常,请查看控制台日志并检查配置文件。"); } return result; } } ================================================ FILE: newbee-mall-cloud-shop-cart-service/newbee-mall-cloud-shop-cart-web/src/main/java/ltd/shopcart/cloud/newbee/config/ShopCartServiceSwagger3Config.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.shopcart.cloud.newbee.config; import ltd.common.cloud.newbee.pojo.MallUserToken; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.builders.RequestParameterBuilder; import springfox.documentation.oas.annotations.EnableOpenApi; import springfox.documentation.schema.ScalarType; import springfox.documentation.service.ApiInfo; import springfox.documentation.service.ParameterType; import springfox.documentation.service.RequestParameter; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket; import java.util.ArrayList; import java.util.List; @Configuration @EnableOpenApi public class ShopCartServiceSwagger3Config{ @Bean public Docket api() { return new Docket(DocumentationType.OAS_30) .apiInfo(apiInfo()) .ignoredParameterTypes(MallUserToken.class) .select() .apis(RequestHandlerSelectors.basePackage("ltd.shopcart.cloud.newbee.controller")) .paths(PathSelectors.any()) .build() .globalRequestParameters(getGlobalRequestParameters()); } //生成全局通用参数 private List getGlobalRequestParameters() { List parameters = new ArrayList<>(); parameters.add(new RequestParameterBuilder() .name("token") .description("登录认证token") .required(false) // 非必传 .in(ParameterType.HEADER) //请求头中的参数,其它类型可以点进ParameterType类中查看 .query(q -> q.model(m -> m.scalarModel(ScalarType.STRING))) .build()); return parameters; } private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("newbee-mall-cloud-shop-cart-service接口文档") .description("swagger接口文档") .version("2.0") .build(); } } ================================================ FILE: newbee-mall-cloud-shop-cart-service/newbee-mall-cloud-shop-cart-web/src/main/java/ltd/shopcart/cloud/newbee/config/ShopCartServiceWebMvcConfigurer.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.shopcart.cloud.newbee.config; import com.alibaba.cloud.seata.web.SeataHandlerInterceptor; import com.alibaba.cloud.sentinel.SentinelProperties; import com.alibaba.csp.sentinel.adapter.spring.webmvc.SentinelWebInterceptor; import ltd.shopcart.cloud.newbee.config.handler.TokenToMallUserMethodArgumentResolver; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Lazy; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import java.util.List; import java.util.Optional; @Configuration public class ShopCartServiceWebMvcConfigurer extends WebMvcConfigurationSupport { private static final Logger log = LoggerFactory.getLogger(ShopCartServiceWebMvcConfigurer.class); @Autowired private SentinelProperties sentinelProperties; @Autowired private Optional sentinelWebInterceptorOptional; @Autowired @Lazy private TokenToMallUserMethodArgumentResolver tokenToMallUserMethodArgumentResolver; /** * @param argumentResolvers * @tip @TokenToMallUser 注解处理方法 */ public void addArgumentResolvers(List argumentResolvers) { argumentResolvers.add(tokenToMallUserMethodArgumentResolver); } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry. addResourceHandler("/swagger-ui/**") .addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/") .resourceChain(false); } public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new SeataHandlerInterceptor()).addPathPatterns("/**"); if (this.sentinelWebInterceptorOptional.isPresent()) { SentinelProperties.Filter filterConfig = this.sentinelProperties.getFilter(); registry.addInterceptor((HandlerInterceptor) this.sentinelWebInterceptorOptional.get()).order(filterConfig.getOrder()).addPathPatterns(filterConfig.getUrlPatterns()); log.info("[Sentinel Starter] register SentinelWebInterceptor with urlPatterns: {}.", filterConfig.getUrlPatterns()); } } } ================================================ FILE: newbee-mall-cloud-shop-cart-service/newbee-mall-cloud-shop-cart-web/src/main/java/ltd/shopcart/cloud/newbee/config/annotation/TokenToMallUser.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.shopcart.cloud.newbee.config.annotation; import java.lang.annotation.*; @Target({ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface TokenToMallUser { /** * 当前用户在request中的名字 * * @return */ String value() default "user"; } ================================================ FILE: newbee-mall-cloud-shop-cart-service/newbee-mall-cloud-shop-cart-web/src/main/java/ltd/shopcart/cloud/newbee/config/handler/TokenToMallUserMethodArgumentResolver.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.shopcart.cloud.newbee.config.handler; import ltd.common.cloud.newbee.enums.ServiceResultEnum; import ltd.common.cloud.newbee.dto.Result; import ltd.common.cloud.newbee.exception.NewBeeMallException; import ltd.common.cloud.newbee.pojo.MallUserToken; import ltd.shopcart.cloud.newbee.config.annotation.TokenToMallUser; import ltd.user.cloud.newbee.dto.MallUserDTO; import ltd.user.cloud.newbee.openfeign.NewBeeCloudUserServiceFeign; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.MethodParameter; import org.springframework.stereotype.Component; import org.springframework.web.bind.support.WebDataBinderFactory; import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.method.support.ModelAndViewContainer; @Component public class TokenToMallUserMethodArgumentResolver implements HandlerMethodArgumentResolver { @Autowired private NewBeeCloudUserServiceFeign newBeeCloudUserService; public TokenToMallUserMethodArgumentResolver() { } public boolean supportsParameter(MethodParameter parameter) { if (parameter.hasParameterAnnotation(TokenToMallUser.class)) { return true; } return false; } public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) { if (parameter.getParameterAnnotation(TokenToMallUser.class) instanceof TokenToMallUser) { String token = webRequest.getHeader("token"); if (null != token && !"".equals(token) && token.length() == 32) { Result result = newBeeCloudUserService.getMallUserByToken(token); if (result == null || result.getResultCode() != 200 || result.getData() == null) { NewBeeMallException.fail(ServiceResultEnum.TOKEN_EXPIRE_ERROR.getResult()); } MallUserToken mallUserToken = new MallUserToken(); mallUserToken.setToken(token); mallUserToken.setUserId(result.getData().getUserId()); return mallUserToken; } else { NewBeeMallException.fail(ServiceResultEnum.NOT_LOGIN_ERROR.getResult()); } } return null; } } ================================================ FILE: newbee-mall-cloud-shop-cart-service/newbee-mall-cloud-shop-cart-web/src/main/java/ltd/shopcart/cloud/newbee/controller/NewBeeMallShoppingCartController.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.shopcart.cloud.newbee.controller; import io.seata.core.context.RootContext; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import ltd.common.cloud.newbee.enums.ServiceResultEnum; import ltd.common.cloud.newbee.dto.PageQueryUtil; import ltd.common.cloud.newbee.dto.PageResult; import ltd.common.cloud.newbee.dto.Result; import ltd.common.cloud.newbee.dto.ResultGenerator; import ltd.common.cloud.newbee.exception.NewBeeMallException; import ltd.common.cloud.newbee.pojo.MallUserToken; import ltd.shopcart.cloud.newbee.config.annotation.TokenToMallUser; import ltd.shopcart.cloud.newbee.controller.param.SaveCartItemParam; import ltd.shopcart.cloud.newbee.controller.param.UpdateCartItemParam; import ltd.shopcart.cloud.newbee.controller.vo.NewBeeMallShoppingCartItemVO; import ltd.shopcart.cloud.newbee.entity.NewBeeMallShoppingCartItem; import ltd.shopcart.cloud.newbee.service.NewBeeMallShoppingCartService; import org.springframework.http.HttpRequest; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @RestController @Api(value = "v1", tags = "新蜂商城购物车相关接口") public class NewBeeMallShoppingCartController { @Resource private NewBeeMallShoppingCartService newBeeMallShoppingCartService; @GetMapping("/shop-cart/page") @ApiOperation(value = "购物车列表(每页默认5条)", notes = "传参为页码") public Result>> cartItemPageList(Integer pageNumber, @TokenToMallUser MallUserToken loginMallUserToken) { Map params = new HashMap(8); if (pageNumber == null || pageNumber < 1) { pageNumber = 1; } params.put("userId", loginMallUserToken.getUserId()); params.put("page", pageNumber); params.put("limit", 5); //封装分页请求参数 PageQueryUtil pageUtil = new PageQueryUtil(params); return ResultGenerator.genSuccessResult(newBeeMallShoppingCartService.getMyShoppingCartItems(pageUtil)); } @GetMapping("/shop-cart") @ApiOperation(value = "购物车列表(网页移动端不分页)", notes = "") public Result> cartItemList(@TokenToMallUser MallUserToken loginMallUserToken) { return ResultGenerator.genSuccessResult(newBeeMallShoppingCartService.getMyShoppingCartItems(loginMallUserToken.getUserId())); } @PostMapping("/shop-cart") @ApiOperation(value = "添加商品到购物车接口", notes = "传参为商品id、数量") public Result saveNewBeeMallShoppingCartItem(@RequestBody SaveCartItemParam saveCartItemParam, @TokenToMallUser MallUserToken loginMallUserToken) { String saveResult = newBeeMallShoppingCartService.saveNewBeeMallCartItem(saveCartItemParam, loginMallUserToken.getUserId()); //添加成功 if (ServiceResultEnum.SUCCESS.getResult().equals(saveResult)) { return ResultGenerator.genSuccessResult(); } //添加失败 return ResultGenerator.genFailResult(saveResult); } @PutMapping("/shop-cart") @ApiOperation(value = "修改购物项数据", notes = "传参为购物项id、数量") public Result updateNewBeeMallShoppingCartItem(@RequestBody UpdateCartItemParam updateCartItemParam, @TokenToMallUser MallUserToken loginMallUserToken) { String updateResult = newBeeMallShoppingCartService.updateNewBeeMallCartItem(updateCartItemParam, loginMallUserToken.getUserId()); //修改成功 if (ServiceResultEnum.SUCCESS.getResult().equals(updateResult)) { return ResultGenerator.genSuccessResult(); } //修改失败 return ResultGenerator.genFailResult(updateResult); } @DeleteMapping("/shop-cart/{newBeeMallShoppingCartItemId}") @ApiOperation(value = "删除购物项", notes = "传参为购物项id") public Result updateNewBeeMallShoppingCartItem(@PathVariable("newBeeMallShoppingCartItemId") Long newBeeMallShoppingCartItemId, @TokenToMallUser MallUserToken loginMallUserToken) { NewBeeMallShoppingCartItem newBeeMallCartItemById = newBeeMallShoppingCartService.getNewBeeMallCartItemById(newBeeMallShoppingCartItemId); if (!loginMallUserToken.getUserId().equals(newBeeMallCartItemById.getUserId())) { return ResultGenerator.genFailResult(ServiceResultEnum.REQUEST_FORBIDEN_ERROR.getResult()); } Boolean deleteResult = newBeeMallShoppingCartService.deleteById(newBeeMallShoppingCartItemId, loginMallUserToken.getUserId()); //删除成功 if (deleteResult) { return ResultGenerator.genSuccessResult(); } //删除失败 return ResultGenerator.genFailResult(ServiceResultEnum.OPERATE_ERROR.getResult()); } @GetMapping("/shop-cart/settle") @ApiOperation(value = "根据购物项id数组查询购物项明细", notes = "确认订单页面使用") public Result> toSettle(Long[] cartItemIds, @TokenToMallUser MallUserToken loginMallUserToken) { if (cartItemIds.length < 1) { NewBeeMallException.fail("参数异常"); } int priceTotal = 0; List itemsForSettle = newBeeMallShoppingCartService.getCartItemsForSettle(Arrays.asList(cartItemIds), loginMallUserToken.getUserId()); if (CollectionUtils.isEmpty(itemsForSettle)) { //无数据则抛出异常 NewBeeMallException.fail("参数异常"); } else { //总价 for (NewBeeMallShoppingCartItemVO newBeeMallShoppingCartItemVO : itemsForSettle) { priceTotal += newBeeMallShoppingCartItemVO.getGoodsCount() * newBeeMallShoppingCartItemVO.getSellingPrice(); } if (priceTotal < 1) { NewBeeMallException.fail("价格异常"); } } return ResultGenerator.genSuccessResult(itemsForSettle); } @GetMapping("/shop-cart/listByCartItemIds") @ApiOperation(value = "购物车列表", notes = "") public Result> cartItemListByIds(@RequestParam("cartItemIds") List cartItemIds) { if (CollectionUtils.isEmpty(cartItemIds)) { return ResultGenerator.genFailResult("error param"); } return ResultGenerator.genSuccessResult(newBeeMallShoppingCartService.getCartItemsByCartIds(cartItemIds)); } @DeleteMapping("/shop-cart/deleteByCartItemIds") @ApiOperation(value = "批量删除购物项", notes = "") public Result deleteByCartItemIds(@RequestParam("cartItemIds") List cartItemIds, HttpServletRequest request) { System.out.println("RootContext.getXID()="+ RootContext.getXID()); if (CollectionUtils.isEmpty(cartItemIds)) { return ResultGenerator.genFailResult("error param"); } return ResultGenerator.genSuccessResult(newBeeMallShoppingCartService.deleteCartItemsByCartIds(cartItemIds) > 0); } } ================================================ FILE: newbee-mall-cloud-shop-cart-service/newbee-mall-cloud-shop-cart-web/src/main/java/ltd/shopcart/cloud/newbee/controller/param/SaveCartItemParam.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.shopcart.cloud.newbee.controller.param; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; /** * 添加购物项param */ @Data public class SaveCartItemParam implements Serializable { @ApiModelProperty("商品数量") private Integer goodsCount; @ApiModelProperty("商品id") private Long goodsId; } ================================================ FILE: newbee-mall-cloud-shop-cart-service/newbee-mall-cloud-shop-cart-web/src/main/java/ltd/shopcart/cloud/newbee/controller/param/UpdateCartItemParam.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.shopcart.cloud.newbee.controller.param; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; /** * 修改购物项param */ @Data public class UpdateCartItemParam implements Serializable { @ApiModelProperty("购物项id") private Long cartItemId; @ApiModelProperty("商品数量") private Integer goodsCount; } ================================================ FILE: newbee-mall-cloud-shop-cart-service/newbee-mall-cloud-shop-cart-web/src/main/java/ltd/shopcart/cloud/newbee/controller/vo/NewBeeMallShoppingCartItemVO.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.shopcart.cloud.newbee.controller.vo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; /** * 购物车页面购物项VO */ @Data public class NewBeeMallShoppingCartItemVO implements Serializable { @ApiModelProperty("购物项id") private Long cartItemId; @ApiModelProperty("商品id") private Long goodsId; @ApiModelProperty("商品数量") private Integer goodsCount; @ApiModelProperty("商品名称") private String goodsName; @ApiModelProperty("商品图片") private String goodsCoverImg; @ApiModelProperty("商品价格") private Integer sellingPrice; } ================================================ FILE: newbee-mall-cloud-shop-cart-service/newbee-mall-cloud-shop-cart-web/src/main/java/ltd/shopcart/cloud/newbee/dao/NewBeeMallShoppingCartItemMapper.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.shopcart.cloud.newbee.dao; import ltd.common.cloud.newbee.dto.PageQueryUtil; import ltd.shopcart.cloud.newbee.entity.NewBeeMallShoppingCartItem; import org.apache.ibatis.annotations.Param; import java.util.List; public interface NewBeeMallShoppingCartItemMapper { int deleteByPrimaryKey(Long cartItemId); int insert(NewBeeMallShoppingCartItem record); int insertSelective(NewBeeMallShoppingCartItem record); NewBeeMallShoppingCartItem selectByPrimaryKey(Long cartItemId); NewBeeMallShoppingCartItem selectByUserIdAndGoodsId(@Param("newBeeMallUserId") Long newBeeMallUserId, @Param("goodsId") Long goodsId); List selectByUserId(@Param("newBeeMallUserId") Long newBeeMallUserId, @Param("number") int number); List selectByUserIdAndCartItemIds(@Param("newBeeMallUserId") Long newBeeMallUserId, @Param("cartItemIds") List cartItemIds); List selectByCartItemIds(@Param("cartItemIds") List cartItemIds); int selectCountByUserId(Long newBeeMallUserId); int updateByPrimaryKeySelective(NewBeeMallShoppingCartItem record); int updateByPrimaryKey(NewBeeMallShoppingCartItem record); int deleteBatch(List ids); List findMyNewBeeMallCartItems(PageQueryUtil pageUtil); int getTotalMyNewBeeMallCartItems(PageQueryUtil pageUtil); } ================================================ FILE: newbee-mall-cloud-shop-cart-service/newbee-mall-cloud-shop-cart-web/src/main/java/ltd/shopcart/cloud/newbee/entity/NewBeeMallShoppingCartItem.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.shopcart.cloud.newbee.entity; import lombok.Data; import java.util.Date; @Data public class NewBeeMallShoppingCartItem { private Long cartItemId; private Long userId; private Long goodsId; private Integer goodsCount; private Byte isDeleted; private Date createTime; private Date updateTime; } ================================================ FILE: newbee-mall-cloud-shop-cart-service/newbee-mall-cloud-shop-cart-web/src/main/java/ltd/shopcart/cloud/newbee/service/NewBeeMallShoppingCartService.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.shopcart.cloud.newbee.service; import ltd.common.cloud.newbee.dto.PageQueryUtil; import ltd.common.cloud.newbee.dto.PageResult; import ltd.shopcart.cloud.newbee.controller.param.SaveCartItemParam; import ltd.shopcart.cloud.newbee.controller.param.UpdateCartItemParam; import ltd.shopcart.cloud.newbee.controller.vo.NewBeeMallShoppingCartItemVO; import ltd.shopcart.cloud.newbee.entity.NewBeeMallShoppingCartItem; import java.util.List; public interface NewBeeMallShoppingCartService { /** * 保存商品至购物车中 * * @param saveCartItemParam * @param userId * @return */ String saveNewBeeMallCartItem(SaveCartItemParam saveCartItemParam, Long userId); /** * 修改购物车中的属性 * * @param updateCartItemParam * @param userId * @return */ String updateNewBeeMallCartItem(UpdateCartItemParam updateCartItemParam, Long userId); /** * 获取购物项详情 * * @param newBeeMallShoppingCartItemId * @return */ NewBeeMallShoppingCartItem getNewBeeMallCartItemById(Long newBeeMallShoppingCartItemId); /** * 删除购物车中的商品 * * @param shoppingCartItemId * @param userId * @return */ Boolean deleteById(Long shoppingCartItemId, Long userId); /** * 获取我的购物车中的列表数据 * * @param newBeeMallUserId * @return */ List getMyShoppingCartItems(Long newBeeMallUserId); /** * 根据userId和cartItemIds获取对应的购物项记录 * * @param cartItemIds * @param newBeeMallUserId * @return */ List getCartItemsForSettle(List cartItemIds, Long newBeeMallUserId); /** * 根据cartItemIds获取对应的购物项记录 * * @param cartItemIds * @return */ List getCartItemsByCartIds(List cartItemIds); /** * 批量删除购物项记录 * * @param cartItemIds * @return */ int deleteCartItemsByCartIds(List cartItemIds); /** * 我的购物车(分页数据) * * @param pageUtil * @return */ PageResult getMyShoppingCartItems(PageQueryUtil pageUtil); } ================================================ FILE: newbee-mall-cloud-shop-cart-service/newbee-mall-cloud-shop-cart-web/src/main/java/ltd/shopcart/cloud/newbee/service/impl/NewBeeMallShoppingCartServiceImpl.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.shopcart.cloud.newbee.service.impl; import ltd.common.cloud.newbee.enums.ServiceResultEnum; import ltd.common.cloud.newbee.dto.PageQueryUtil; import ltd.common.cloud.newbee.dto.PageResult; import ltd.common.cloud.newbee.dto.Result; import ltd.common.cloud.newbee.exception.NewBeeMallException; import ltd.common.cloud.newbee.util.BeanUtil; import ltd.goods.cloud.newbee.dto.NewBeeMallGoodsDTO; import ltd.goods.cloud.newbee.openfeign.NewBeeCloudGoodsServiceFeign; import ltd.shopcart.cloud.newbee.controller.param.SaveCartItemParam; import ltd.shopcart.cloud.newbee.controller.param.UpdateCartItemParam; import ltd.shopcart.cloud.newbee.controller.vo.NewBeeMallShoppingCartItemVO; import ltd.shopcart.cloud.newbee.dao.NewBeeMallShoppingCartItemMapper; import ltd.shopcart.cloud.newbee.entity.NewBeeMallShoppingCartItem; import ltd.shopcart.cloud.newbee.service.NewBeeMallShoppingCartService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @Service public class NewBeeMallShoppingCartServiceImpl implements NewBeeMallShoppingCartService { @Autowired private NewBeeMallShoppingCartItemMapper newBeeMallShoppingCartItemMapper; @Autowired private NewBeeCloudGoodsServiceFeign goodsService; @Override public String saveNewBeeMallCartItem(SaveCartItemParam saveCartItemParam, Long userId) { NewBeeMallShoppingCartItem temp = newBeeMallShoppingCartItemMapper.selectByUserIdAndGoodsId(userId, saveCartItemParam.getGoodsId()); if (temp != null) { //已存在则修改该记录 NewBeeMallException.fail(ServiceResultEnum.SHOPPING_CART_ITEM_EXIST_ERROR.getResult()); } Result goodsDetailResult = goodsService.getGoodsDetail(saveCartItemParam.getGoodsId()); //商品为空 if (goodsDetailResult == null || goodsDetailResult.getResultCode() != 200) { return ServiceResultEnum.GOODS_NOT_EXIST.getResult(); } int totalItem = newBeeMallShoppingCartItemMapper.selectCountByUserId(userId); //超出单个商品的最大数量 if (saveCartItemParam.getGoodsCount() < 1) { return ServiceResultEnum.SHOPPING_CART_ITEM_NUMBER_ERROR.getResult(); } //超出单个商品的最大数量 if (saveCartItemParam.getGoodsCount() > 5) { return ServiceResultEnum.SHOPPING_CART_ITEM_LIMIT_NUMBER_ERROR.getResult(); } //超出最大数量 if (totalItem > 20) { return ServiceResultEnum.SHOPPING_CART_ITEM_TOTAL_NUMBER_ERROR.getResult(); } NewBeeMallShoppingCartItem newBeeMallShoppingCartItem = new NewBeeMallShoppingCartItem(); BeanUtil.copyProperties(saveCartItemParam, newBeeMallShoppingCartItem); newBeeMallShoppingCartItem.setUserId(userId); //保存记录 if (newBeeMallShoppingCartItemMapper.insertSelective(newBeeMallShoppingCartItem) > 0) { return ServiceResultEnum.SUCCESS.getResult(); } return ServiceResultEnum.DB_ERROR.getResult(); } @Override public String updateNewBeeMallCartItem(UpdateCartItemParam updateCartItemParam, Long userId) { NewBeeMallShoppingCartItem newBeeMallShoppingCartItemUpdate = newBeeMallShoppingCartItemMapper.selectByPrimaryKey(updateCartItemParam.getCartItemId()); if (newBeeMallShoppingCartItemUpdate == null) { return ServiceResultEnum.DATA_NOT_EXIST.getResult(); } if (!newBeeMallShoppingCartItemUpdate.getUserId().equals(userId)) { NewBeeMallException.fail(ServiceResultEnum.REQUEST_FORBIDEN_ERROR.getResult()); } //超出单个商品的最大数量 if (updateCartItemParam.getGoodsCount() > 5) { return ServiceResultEnum.SHOPPING_CART_ITEM_LIMIT_NUMBER_ERROR.getResult(); } //当前登录账号的userId与待修改的cartItem中userId不同,返回错误 if (!newBeeMallShoppingCartItemUpdate.getUserId().equals(userId)) { return ServiceResultEnum.NO_PERMISSION_ERROR.getResult(); } //数值相同,则不执行数据操作 if (updateCartItemParam.getGoodsCount().equals(newBeeMallShoppingCartItemUpdate.getGoodsCount())) { return ServiceResultEnum.SUCCESS.getResult(); } newBeeMallShoppingCartItemUpdate.setGoodsCount(updateCartItemParam.getGoodsCount()); newBeeMallShoppingCartItemUpdate.setUpdateTime(new Date()); //修改记录 if (newBeeMallShoppingCartItemMapper.updateByPrimaryKeySelective(newBeeMallShoppingCartItemUpdate) > 0) { return ServiceResultEnum.SUCCESS.getResult(); } return ServiceResultEnum.DB_ERROR.getResult(); } @Override public NewBeeMallShoppingCartItem getNewBeeMallCartItemById(Long newBeeMallShoppingCartItemId) { NewBeeMallShoppingCartItem newBeeMallShoppingCartItem = newBeeMallShoppingCartItemMapper.selectByPrimaryKey(newBeeMallShoppingCartItemId); if (newBeeMallShoppingCartItem == null) { NewBeeMallException.fail(ServiceResultEnum.DATA_NOT_EXIST.getResult()); } return newBeeMallShoppingCartItem; } @Override public Boolean deleteById(Long shoppingCartItemId, Long userId) { NewBeeMallShoppingCartItem newBeeMallShoppingCartItem = newBeeMallShoppingCartItemMapper.selectByPrimaryKey(shoppingCartItemId); if (newBeeMallShoppingCartItem == null) { return false; } //userId不同不能删除 if (!userId.equals(newBeeMallShoppingCartItem.getUserId())) { return false; } return newBeeMallShoppingCartItemMapper.deleteByPrimaryKey(shoppingCartItemId) > 0; } @Override public List getMyShoppingCartItems(Long newBeeMallUserId) { List newBeeMallShoppingCartItemVOS = new ArrayList<>(); List newBeeMallShoppingCartItems = newBeeMallShoppingCartItemMapper.selectByUserId(newBeeMallUserId, 20); return getNewBeeMallShoppingCartItemVOS(newBeeMallShoppingCartItemVOS, newBeeMallShoppingCartItems); } @Override public List getCartItemsForSettle(List cartItemIds, Long newBeeMallUserId) { List newBeeMallShoppingCartItemVOS = new ArrayList<>(); if (CollectionUtils.isEmpty(cartItemIds)) { NewBeeMallException.fail("购物项不能为空"); } List newBeeMallShoppingCartItems = newBeeMallShoppingCartItemMapper.selectByUserIdAndCartItemIds(newBeeMallUserId, cartItemIds); if (CollectionUtils.isEmpty(newBeeMallShoppingCartItems)) { NewBeeMallException.fail("购物项不能为空"); } if (newBeeMallShoppingCartItems.size() != cartItemIds.size()) { NewBeeMallException.fail("参数异常"); } return getNewBeeMallShoppingCartItemVOS(newBeeMallShoppingCartItemVOS, newBeeMallShoppingCartItems); } @Override public List getCartItemsByCartIds(List cartItemIds) { return newBeeMallShoppingCartItemMapper.selectByCartItemIds(cartItemIds); } @Override public int deleteCartItemsByCartIds(List cartItemIds) { return newBeeMallShoppingCartItemMapper.deleteBatch(cartItemIds); } /** * 数据转换 * * @param newBeeMallShoppingCartItemVOS * @param newBeeMallShoppingCartItems * @return */ private List getNewBeeMallShoppingCartItemVOS(List newBeeMallShoppingCartItemVOS, List newBeeMallShoppingCartItems) { if (!CollectionUtils.isEmpty(newBeeMallShoppingCartItems)) { //查询商品信息并做数据转换 List newBeeMallGoodsIds = newBeeMallShoppingCartItems.stream().map(NewBeeMallShoppingCartItem::getGoodsId).collect(Collectors.toList()); Result> newBeeMallGoodsDTOResult = goodsService.listByGoodsIds(newBeeMallGoodsIds); //商品为空 if (newBeeMallGoodsDTOResult == null || newBeeMallGoodsDTOResult.getResultCode() != 200) { NewBeeMallException.fail(ServiceResultEnum.GOODS_NOT_EXIST.getResult()); } Map newBeeMallGoodsDTOMap = new HashMap<>(); List newBeeMallGoodsDTOS = newBeeMallGoodsDTOResult.getData(); if (!CollectionUtils.isEmpty(newBeeMallGoodsDTOS)) { newBeeMallGoodsDTOMap = newBeeMallGoodsDTOS.stream().collect(Collectors.toMap(NewBeeMallGoodsDTO::getGoodsId, Function.identity(), (entity1, entity2) -> entity1)); } for (NewBeeMallShoppingCartItem newBeeMallShoppingCartItem : newBeeMallShoppingCartItems) { NewBeeMallShoppingCartItemVO newBeeMallShoppingCartItemVO = new NewBeeMallShoppingCartItemVO(); BeanUtil.copyProperties(newBeeMallShoppingCartItem, newBeeMallShoppingCartItemVO); if (newBeeMallGoodsDTOMap.containsKey(newBeeMallShoppingCartItem.getGoodsId())) { NewBeeMallGoodsDTO newBeeMallGoodsDtoTemp = newBeeMallGoodsDTOMap.get(newBeeMallShoppingCartItem.getGoodsId()); newBeeMallShoppingCartItemVO.setGoodsCoverImg(newBeeMallGoodsDtoTemp.getGoodsCoverImg()); String goodsName = newBeeMallGoodsDtoTemp.getGoodsName(); // 字符串过长导致文字超出的问题 if (goodsName.length() > 28) { goodsName = goodsName.substring(0, 28) + "..."; } newBeeMallShoppingCartItemVO.setGoodsName(goodsName); newBeeMallShoppingCartItemVO.setSellingPrice(newBeeMallGoodsDtoTemp.getSellingPrice()); newBeeMallShoppingCartItemVOS.add(newBeeMallShoppingCartItemVO); } } } return newBeeMallShoppingCartItemVOS; } @Override public PageResult getMyShoppingCartItems(PageQueryUtil pageUtil) { List newBeeMallShoppingCartItemVOS = new ArrayList<>(); List newBeeMallShoppingCartItems = newBeeMallShoppingCartItemMapper.findMyNewBeeMallCartItems(pageUtil); int total = newBeeMallShoppingCartItemMapper.getTotalMyNewBeeMallCartItems(pageUtil); PageResult pageResult = new PageResult(getNewBeeMallShoppingCartItemVOS(newBeeMallShoppingCartItemVOS, newBeeMallShoppingCartItems), total, pageUtil.getLimit(), pageUtil.getPage()); return pageResult; } } ================================================ FILE: newbee-mall-cloud-shop-cart-service/newbee-mall-cloud-shop-cart-web/src/main/resources/application.properties ================================================ server.port=29030 # 服务名称 spring.application.name=newbee-mall-cloud-shop-cart-service # Nacos地址 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 # Nacos登录用户名(默认为nacos,生产环境一定要修改) spring.cloud.nacos.username=nacos # Nacos登录密码(默认为nacos,生产环境一定要修改) spring.cloud.nacos.password=nacos # datasource config (MySQL) spring.datasource.name=newbee-mall-cloud-shop-cart-datasource spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/newbee_mall_cloud_cart_db?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=utf8&autoReconnect=true&useSSL=false&allowMultiQueries=true spring.datasource.username=root spring.datasource.password=123456 # 指定数据源类型 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource # Druid 数据源设置 # 初始化时建立数据库连接的个数 spring.datasource.initialSize=10 # 最小连接池数量 spring.datasource.minIdle=5 # 最大连接池数量 spring.datasource.maxActive=30 # 配置获取连接等待超时的时间 spring.datasource.maxWait=60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 spring.datasource.timeBetweenEvictionRunsMillis=60000 # 配置一个连接在池中最小生存的时间,单位是毫秒 spring.datasource.minEvictableIdleTimeMillis=300000 # 用来检测连接是否有效的SQL语句 spring.datasource.validationQuery=SELECT 1 spring.datasource.testWhileIdle=true spring.datasource.testOnBorrow=false spring.datasource.testOnReturn=false # mybatis config mybatis.mapper-locations=classpath:mapper/*Mapper.xml # sentinel config spring.cloud.sentinel.transport.port=8930 spring.cloud.sentinel.transport.clientIp=127.0.0.1 # 指定Sentinel控制台地址 spring.cloud.sentinel.transport.dashboard=127.0.0.1:9113 # openfeign config feign.client.config.default.connectTimeout=2000 feign.client.config.default.readTimeout=5000 feign.compression.request.enabled=true feign.compression.request.mime-types=text/xml,application/xml,application/json feign.compression.request.min-request-size=1024 feign.compression.response.enabled=true # 演示需要,开启OpenFeign和当前项目中的DEBUG级别日志 #logging.level.ltd.user.cloud.newbee.openfeign=debug #logging.level.ltd.goods.cloud.newbee.openfeign=debug #logging.level.ltd.shopcart.cloud.newbee=debug # Sleuth采样率,取值范围为[0.1,1.0],值越大收集越及时,但性能影响也越大 spring.sleuth.sampler.probability=1.0 # 每秒数据采集量,最多n条/秒Trace spring.sleuth.sampler.rate=500 spring.zipkin.base-url=http://localhost:9411 #seata config seata.enabled=true seata.application-id=shopcart-server #事务分组配置 seata.tx-service-group=newbee_cloud_save_order_group service.vgroupMapping.newbee_cloud_save_order_group=default #连接Nacos服务中心的配置信息 seata.registry.type=nacos seata.registry.nacos.application=seata-server seata.registry.nacos.server-addr=127.0.0.1:8848 seata.registry.nacos.username=nacos seata.registry.nacos.password=nacos seata.registry.nacos.group=DEFAULT_GROUP seata.registry.nacos.cluster=default ================================================ FILE: newbee-mall-cloud-shop-cart-service/newbee-mall-cloud-shop-cart-web/src/main/resources/logback.xml ================================================ ${APP_NAME} INFO ${CONSOLE_LOG_PATTERN} utf8 192.168.110.57:4560 INFO ================================================ FILE: newbee-mall-cloud-shop-cart-service/newbee-mall-cloud-shop-cart-web/src/main/resources/mapper/NewBeeMallShoppingCartItemMapper.xml ================================================ cart_item_id, user_id, goods_id, goods_count, is_deleted, create_time, update_time update tb_newbee_mall_shopping_cart_item set is_deleted = 1 where cart_item_id = #{cartItemId,jdbcType=BIGINT} and is_deleted = 0 update tb_newbee_mall_shopping_cart_item set is_deleted=1 where cart_item_id in #{id} insert into tb_newbee_mall_shopping_cart_item (cart_item_id, user_id, goods_id, goods_count, is_deleted, create_time, update_time) values (#{cartItemId,jdbcType=BIGINT}, #{userId,jdbcType=BIGINT}, #{goodsId,jdbcType=BIGINT}, #{goodsCount,jdbcType=INTEGER}, #{isDeleted,jdbcType=TINYINT}, #{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP}) insert into tb_newbee_mall_shopping_cart_item cart_item_id, user_id, goods_id, goods_count, is_deleted, create_time, update_time, #{cartItemId,jdbcType=BIGINT}, #{userId,jdbcType=BIGINT}, #{goodsId,jdbcType=BIGINT}, #{goodsCount,jdbcType=INTEGER}, #{isDeleted,jdbcType=TINYINT}, #{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP}, update tb_newbee_mall_shopping_cart_item user_id = #{userId,jdbcType=BIGINT}, goods_id = #{goodsId,jdbcType=BIGINT}, goods_count = #{goodsCount,jdbcType=INTEGER}, is_deleted = #{isDeleted,jdbcType=TINYINT}, create_time = #{createTime,jdbcType=TIMESTAMP}, update_time = #{updateTime,jdbcType=TIMESTAMP}, where cart_item_id = #{cartItemId,jdbcType=BIGINT} update tb_newbee_mall_shopping_cart_item set user_id = #{userId,jdbcType=BIGINT}, goods_id = #{goodsId,jdbcType=BIGINT}, goods_count = #{goodsCount,jdbcType=INTEGER}, is_deleted = #{isDeleted,jdbcType=TINYINT}, create_time = #{createTime,jdbcType=TIMESTAMP}, update_time = #{updateTime,jdbcType=TIMESTAMP} where cart_item_id = #{cartItemId,jdbcType=BIGINT} ================================================ FILE: newbee-mall-cloud-shop-cart-service/pom.xml ================================================ 4.0.0 ltd.newbee.cloud newbee-mall-cloud-shop-cart-service 0.0.1-SNAPSHOT pom newbee-mall-cloud-shop-cart-service 购物车模块 ltd.newbee.cloud newbee-mall-cloud 0.0.1-SNAPSHOT 1.8 newbee-mall-cloud-shop-cart-web newbee-mall-cloud-shop-cart-api ================================================ FILE: newbee-mall-cloud-user-service/newbee-mall-cloud-user-api/pom.xml ================================================ 4.0.0 ltd.user.newbee.cloud newbee-mall-cloud-user-api jar 0.0.1-SNAPSHOT newbee-mall-cloud-user-api 用户服务openfeign ltd.newbee.cloud newbee-mall-cloud-user-service 0.0.1-SNAPSHOT 1.8 org.springframework.cloud spring-cloud-starter-openfeign ltd.newbee.cloud newbee-mall-cloud-common 0.0.1-SNAPSHOT ================================================ FILE: newbee-mall-cloud-user-service/newbee-mall-cloud-user-api/src/main/java/ltd/user/cloud/newbee/dto/MallUserDTO.java ================================================ package ltd.user.cloud.newbee.dto; import java.io.Serializable; public class MallUserDTO implements Serializable { private Long userId; private String nickName; private String loginName; private String introduceSign; public Long getUserId() { return userId; } public void setUserId(Long userId) { this.userId = userId; } public String getNickName() { return nickName; } public void setNickName(String nickName) { this.nickName = nickName; } public String getLoginName() { return loginName; } public void setLoginName(String loginName) { this.loginName = loginName; } public String getIntroduceSign() { return introduceSign; } public void setIntroduceSign(String introduceSign) { this.introduceSign = introduceSign; } } ================================================ FILE: newbee-mall-cloud-user-service/newbee-mall-cloud-user-api/src/main/java/ltd/user/cloud/newbee/openfeign/NewBeeCloudUserServiceFeign.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本系统已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.user.cloud.newbee.openfeign; import ltd.user.cloud.newbee.dto.MallUserDTO; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import ltd.common.cloud.newbee.dto.Result; import org.springframework.web.bind.annotation.RequestParam; @FeignClient(value = "newbee-mall-cloud-user-service", path = "/users") public interface NewBeeCloudUserServiceFeign { @GetMapping(value = "/admin/{token}") Result getAdminUserByToken(@PathVariable(value = "token") String token); @GetMapping(value = "/mall/getDetailByToken") Result getMallUserByToken(@RequestParam(value = "token") String token); } ================================================ FILE: newbee-mall-cloud-user-service/newbee-mall-cloud-user-web/pom.xml ================================================ 4.0.0 ltd.user.newbee.cloud newbee-mall-cloud-user-web 0.0.1-SNAPSHOT newbee-mall-cloud-user-web 用户服务 ltd.newbee.cloud newbee-mall-cloud-user-service 0.0.1-SNAPSHOT 1.8 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-test test com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery org.springframework.boot spring-boot-starter-validation org.mybatis.spring.boot mybatis-spring-boot-starter com.alibaba.cloud spring-cloud-starter-alibaba-sentinel org.springframework.cloud spring-cloud-starter-sleuth org.springframework.cloud spring-cloud-sleuth-zipkin net.logstash.logback logstash-logback-encoder ${logstash-logback-encoder.version} org.projectlombok lombok ${lombok.version} provided io.springfox springfox-boot-starter mysql mysql-connector-java runtime org.springframework.boot spring-boot-starter-data-redis ltd.newbee.cloud newbee-mall-cloud-common 0.0.1-SNAPSHOT ================================================ FILE: newbee-mall-cloud-user-service/newbee-mall-cloud-user-web/src/main/java/ltd/user/cloud/newbee/NewBeeMallCloudUserServiceApplication.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本系统已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.user.cloud.newbee; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; /** * @author 程序员十三 * @qq交流群 791509631 * @email 2449207463@qq.com * @link https://github.com/newbee-ltd */ @SpringBootApplication @EnableDiscoveryClient @MapperScan("ltd.user.cloud.newbee.dao") public class NewBeeMallCloudUserServiceApplication { public static void main(String[] args) { System.setProperty("nacos.logging.default.config.enabled","false"); SpringApplication.run(NewBeeMallCloudUserServiceApplication.class, args); } } ================================================ FILE: newbee-mall-cloud-user-service/newbee-mall-cloud-user-web/src/main/java/ltd/user/cloud/newbee/config/RedisConfig.java ================================================ package ltd.user.cloud.newbee.config; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.CachingConfigurerSupport; import org.springframework.cache.annotation.EnableCaching; import org.springframework.cache.interceptor.KeyGenerator; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.cache.RedisCacheManager; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; import javax.annotation.Resource; import java.io.Serializable; import java.lang.reflect.Method; import java.util.HashSet; import java.util.Set; @Configuration @EnableCaching @AutoConfigureAfter(RedisAutoConfiguration.class) public class RedisConfig extends CachingConfigurerSupport { @Resource private LettuceConnectionFactory lettuceConnectionFactory; public RedisConfig(){} @Bean public RedisTemplate redisCacheTemplate(LettuceConnectionFactory redisConnectionFactory){ RedisTemplate template = new RedisTemplate(); template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); template.setHashKeySerializer(new StringRedisSerializer()); template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); template.setConnectionFactory(redisConnectionFactory); return template; } @Bean public CacheManager cacheManager() { RedisCacheManager.RedisCacheManagerBuilder builder = RedisCacheManager.RedisCacheManagerBuilder .fromConnectionFactory(lettuceConnectionFactory); @SuppressWarnings("serial") Set cacheNames = new HashSet() { { add("codeNameCache"); } }; builder.initialCacheNames(cacheNames); return builder.build(); } @Bean public KeyGenerator keyGenerator() { return new KeyGenerator() { @Override public Object generate(Object target, Method method, Object... params) { StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append(target.getClass().getName()); stringBuffer.append(method.getName()); for (Object obj : params) { stringBuffer.append(obj.toString()); } return stringBuffer.toString(); } }; } } ================================================ FILE: newbee-mall-cloud-user-service/newbee-mall-cloud-user-web/src/main/java/ltd/user/cloud/newbee/config/UserServiceExceptionHandler.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.user.cloud.newbee.config; import ltd.common.cloud.newbee.enums.ServiceResultEnum; import ltd.common.cloud.newbee.dto.Result; import ltd.common.cloud.newbee.exception.NewBeeMallException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.validation.BindException; import org.springframework.validation.BindingResult; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import javax.servlet.http.HttpServletRequest; import java.util.Objects; /** * 全局异常处理 */ @RestControllerAdvice public class UserServiceExceptionHandler { private static final Logger log = LoggerFactory.getLogger(UserServiceExceptionHandler.class); @ExceptionHandler(BindException.class) public Object bindException(BindException e) { log.error("UserServiceExceptionHandler:",e); Result result = new Result(); result.setResultCode(510); BindingResult bindingResult = e.getBindingResult(); result.setMessage(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage()); return result; } @ExceptionHandler(MethodArgumentNotValidException.class) public Object bindException(MethodArgumentNotValidException e) { log.error("UserServiceExceptionHandler:",e); Result result = new Result(); result.setResultCode(510); BindingResult bindingResult = e.getBindingResult(); result.setMessage(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage()); return result; } @ExceptionHandler(Exception.class) public Object handleException(Exception e, HttpServletRequest req) { log.error("UserServiceExceptionHandler:",e); Result result = new Result(); result.setResultCode(500); //区分是否为自定义异常 if (e instanceof NewBeeMallException) { result.setMessage(e.getMessage()); if (e.getMessage().equals(ServiceResultEnum.ADMIN_NOT_LOGIN_ERROR.getResult()) || e.getMessage().equals(ServiceResultEnum.ADMIN_TOKEN_EXPIRE_ERROR.getResult())) { result.setResultCode(419); } if (e.getMessage().equals(ServiceResultEnum.NOT_LOGIN_ERROR.getResult()) || e.getMessage().equals(ServiceResultEnum.TOKEN_EXPIRE_ERROR.getResult())) { result.setResultCode(416); } } else { e.printStackTrace(); result.setMessage("未知异常,请查看控制台日志并检查配置文件。"); } return result; } } ================================================ FILE: newbee-mall-cloud-user-service/newbee-mall-cloud-user-web/src/main/java/ltd/user/cloud/newbee/config/UserServiceWebMvcConfigurer.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.user.cloud.newbee.config; import com.alibaba.cloud.sentinel.SentinelProperties; import com.alibaba.csp.sentinel.adapter.spring.webmvc.SentinelWebInterceptor; import ltd.user.cloud.newbee.config.handler.TokenToAdminUserMethodArgumentResolver; import ltd.user.cloud.newbee.config.handler.TokenToMallUserMethodArgumentResolver; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; import java.util.List; import java.util.Optional; @Configuration public class UserServiceWebMvcConfigurer extends WebMvcConfigurationSupport { private static final Logger log = LoggerFactory.getLogger(UserServiceWebMvcConfigurer.class); @Autowired private SentinelProperties sentinelProperties; @Autowired private Optional sentinelWebInterceptorOptional; @Autowired private TokenToAdminUserMethodArgumentResolver tokenToAdminUserMethodArgumentResolver; @Autowired private TokenToMallUserMethodArgumentResolver tokenToMallUserMethodArgumentResolver; /** * @param argumentResolvers * @tip @TokenToAdminUser 注解处理方法 */ public void addArgumentResolvers(List argumentResolvers) { argumentResolvers.add(tokenToAdminUserMethodArgumentResolver); argumentResolvers.add(tokenToMallUserMethodArgumentResolver); } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry. addResourceHandler("/swagger-ui/**") .addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/") .resourceChain(false); } public void addInterceptors(InterceptorRegistry registry) { if (this.sentinelWebInterceptorOptional.isPresent()) { SentinelProperties.Filter filterConfig = this.sentinelProperties.getFilter(); registry.addInterceptor((HandlerInterceptor) this.sentinelWebInterceptorOptional.get()).order(filterConfig.getOrder()).addPathPatterns(filterConfig.getUrlPatterns()); log.info("[Sentinel Starter] register SentinelWebInterceptor with urlPatterns: {}.", filterConfig.getUrlPatterns()); } } } ================================================ FILE: newbee-mall-cloud-user-service/newbee-mall-cloud-user-web/src/main/java/ltd/user/cloud/newbee/config/UserSwagger3Config.java ================================================ package ltd.user.cloud.newbee.config; import ltd.common.cloud.newbee.pojo.AdminUserToken; import ltd.common.cloud.newbee.pojo.MallUserToken; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.builders.RequestParameterBuilder; import springfox.documentation.oas.annotations.EnableOpenApi; import springfox.documentation.schema.ScalarType; import springfox.documentation.service.ApiInfo; import springfox.documentation.service.ParameterType; import springfox.documentation.service.RequestParameter; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket; import java.util.ArrayList; import java.util.List; @Configuration @EnableOpenApi public class UserSwagger3Config { @Bean public Docket api() { return new Docket(DocumentationType.OAS_30) .apiInfo(apiInfo()) .ignoredParameterTypes(AdminUserToken.class, MallUserToken.class) .select() .apis(RequestHandlerSelectors.basePackage("ltd.user.cloud.newbee.controller")) .paths(PathSelectors.any()) .build() .globalRequestParameters(getGlobalRequestParameters()); } //生成全局通用参数 private List getGlobalRequestParameters() { List parameters = new ArrayList<>(); parameters.add(new RequestParameterBuilder() .name("token") .description("登录认证token") .required(false) // 非必传 .in(ParameterType.HEADER) //请求头中的参数,其它类型可以点进ParameterType类中查看 .query(q -> q.model(m -> m.scalarModel(ScalarType.STRING))) .build()); return parameters; } private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("newbee-mall-cloud-user-service接口文档") .description("swagger接口文档") .version("2.0") .build(); } } ================================================ FILE: newbee-mall-cloud-user-service/newbee-mall-cloud-user-web/src/main/java/ltd/user/cloud/newbee/config/annotation/TokenToAdminUser.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.user.cloud.newbee.config.annotation; import java.lang.annotation.*; @Target({ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface TokenToAdminUser { /** * 当前用户在request中的名字 * * @return */ String value() default "adminUser"; } ================================================ FILE: newbee-mall-cloud-user-service/newbee-mall-cloud-user-web/src/main/java/ltd/user/cloud/newbee/config/annotation/TokenToMallUser.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.user.cloud.newbee.config.annotation; import java.lang.annotation.*; @Target({ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface TokenToMallUser { /** * 当前用户在request中的名字 * * @return */ String value() default "user"; } ================================================ FILE: newbee-mall-cloud-user-service/newbee-mall-cloud-user-web/src/main/java/ltd/user/cloud/newbee/config/handler/TokenToAdminUserMethodArgumentResolver.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.user.cloud.newbee.config.handler; import ltd.common.cloud.newbee.enums.ServiceResultEnum; import ltd.common.cloud.newbee.exception.NewBeeMallException; import ltd.user.cloud.newbee.config.annotation.TokenToAdminUser; import ltd.common.cloud.newbee.pojo.AdminUserToken; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.MethodParameter; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ValueOperations; import org.springframework.stereotype.Component; import org.springframework.web.bind.support.WebDataBinderFactory; import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.method.support.ModelAndViewContainer; @Component public class TokenToAdminUserMethodArgumentResolver implements HandlerMethodArgumentResolver { @Autowired private RedisTemplate redisTemplate; public TokenToAdminUserMethodArgumentResolver() { } public boolean supportsParameter(MethodParameter parameter) { if (parameter.hasParameterAnnotation(TokenToAdminUser.class)) { return true; } return false; } public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) { if (parameter.getParameterAnnotation(TokenToAdminUser.class) instanceof TokenToAdminUser) { String token = webRequest.getHeader("token"); if (null != token && !"".equals(token) && token.length() == 32) { ValueOperations opsForAdminUserToken = redisTemplate.opsForValue(); AdminUserToken adminUserToken = opsForAdminUserToken.get(token); if (adminUserToken == null) { NewBeeMallException.fail(ServiceResultEnum.ADMIN_NOT_LOGIN_ERROR.getResult()); } return adminUserToken; } else { NewBeeMallException.fail(ServiceResultEnum.ADMIN_NOT_LOGIN_ERROR.getResult()); } } return null; } } ================================================ FILE: newbee-mall-cloud-user-service/newbee-mall-cloud-user-web/src/main/java/ltd/user/cloud/newbee/config/handler/TokenToMallUserMethodArgumentResolver.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.user.cloud.newbee.config.handler; import ltd.common.cloud.newbee.enums.ServiceResultEnum; import ltd.common.cloud.newbee.exception.NewBeeMallException; import ltd.common.cloud.newbee.pojo.AdminUserToken; import ltd.common.cloud.newbee.pojo.MallUserToken; import ltd.user.cloud.newbee.config.annotation.TokenToMallUser; import ltd.user.cloud.newbee.dao.MallUserMapper; import ltd.user.cloud.newbee.entity.MallUser; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.MethodParameter; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ValueOperations; import org.springframework.stereotype.Component; import org.springframework.web.bind.support.WebDataBinderFactory; import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.method.support.ModelAndViewContainer; import javax.servlet.http.HttpServletRequest; import java.io.IOException; @Component public class TokenToMallUserMethodArgumentResolver implements HandlerMethodArgumentResolver { @Autowired private RedisTemplate redisTemplate; @Autowired private MallUserMapper mallUserMapper; public TokenToMallUserMethodArgumentResolver() { } public boolean supportsParameter(MethodParameter parameter) { if (parameter.hasParameterAnnotation(TokenToMallUser.class)) { return true; } return false; } public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) { if (parameter.getParameterAnnotation(TokenToMallUser.class) instanceof TokenToMallUser) { String token = webRequest.getHeader("token"); if (null != token && !"".equals(token) && token.length() == 32) { ValueOperations opsForMallUserToken = redisTemplate.opsForValue(); MallUserToken mallUserToken = opsForMallUserToken.get(token); if (mallUserToken == null ) { NewBeeMallException.fail(ServiceResultEnum.TOKEN_EXPIRE_ERROR.getResult()); } MallUser mallUser = mallUserMapper.selectByPrimaryKey(mallUserToken.getUserId()); if (mallUser == null) { NewBeeMallException.fail(ServiceResultEnum.USER_NULL_ERROR.getResult()); } if (mallUser.getLockedFlag().intValue() == 1) { NewBeeMallException.fail(ServiceResultEnum.LOGIN_USER_LOCKED_ERROR.getResult()); } return mallUserToken; } else { NewBeeMallException.fail(ServiceResultEnum.NOT_LOGIN_ERROR.getResult()); } } return null; } public static byte[] getRequestPostBytes(HttpServletRequest request) throws IOException { int contentLength = request.getContentLength(); if (contentLength < 0) { return null; } byte buffer[] = new byte[contentLength]; for (int i = 0; i < contentLength; ) { int readlen = request.getInputStream().read(buffer, i, contentLength - i); if (readlen == -1) { break; } i += readlen; } return buffer; } } ================================================ FILE: newbee-mall-cloud-user-service/newbee-mall-cloud-user-web/src/main/java/ltd/user/cloud/newbee/controller/NewBeeMallCloudAdminUserController.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本系统已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.user.cloud.newbee.controller; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import ltd.common.cloud.newbee.dto.Result; import ltd.common.cloud.newbee.dto.ResultGenerator; import ltd.user.cloud.newbee.config.annotation.TokenToAdminUser; import ltd.user.cloud.newbee.controller.param.AdminLoginParam; import ltd.user.cloud.newbee.controller.param.UpdateAdminNameParam; import ltd.user.cloud.newbee.controller.param.UpdateAdminPasswordParam; import ltd.user.cloud.newbee.entity.AdminUser; import ltd.common.cloud.newbee.pojo.AdminUserToken; import ltd.user.cloud.newbee.service.AdminUserService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.validation.Valid; @Api(value = "v1", tags = "新蜂商城管理员操作相关接口") @RestController public class NewBeeMallCloudAdminUserController { private static final Logger logger = LoggerFactory.getLogger(NewBeeMallCloudAdminUserController.class); @Resource private AdminUserService adminUserService; @ApiOperation(value = "登录接口", notes = "返回token") @RequestMapping(value = "/users/admin/login", method = RequestMethod.POST) public Result login(@RequestBody @Valid AdminLoginParam adminLoginParam) { String loginResult = adminUserService.login(adminLoginParam.getUserName(), adminLoginParam.getPasswordMd5()); logger.info("manage login api,adminName={},loginResult={}", adminLoginParam.getUserName(), loginResult); //登录成功 if (StringUtils.hasText(loginResult) && loginResult.length() == 32) { Result result = ResultGenerator.genSuccessResult(); result.setData(loginResult); return result; } //登录失败 return ResultGenerator.genFailResult(loginResult); } @ApiOperation(value = "获取管理员信息接口") @RequestMapping(value = "/users/admin/profile", method = RequestMethod.POST) public Result profile(@TokenToAdminUser AdminUserToken adminUser) { logger.info("adminUser:{}", adminUser.toString()); AdminUser adminUserEntity = adminUserService.getUserDetailById(adminUser.getAdminUserId()); if (adminUserEntity != null) { adminUserEntity.setLoginPassword("******"); Result result = ResultGenerator.genSuccessResult(); result.setData(adminUserEntity); return result; } return ResultGenerator.genFailResult("无此用户数据"); } @ApiOperation(value = "修改管理员密码接口") @RequestMapping(value = "/users/admin/password", method = RequestMethod.PUT) public Result passwordUpdate(@RequestBody @Valid UpdateAdminPasswordParam adminPasswordParam, @TokenToAdminUser AdminUserToken adminUser) { logger.info("adminUser:{}", adminUser.toString()); if (adminUserService.updatePassword(adminUser.getAdminUserId(), adminPasswordParam.getOriginalPassword(), adminPasswordParam.getNewPassword())) { return ResultGenerator.genSuccessResult(); } else { return ResultGenerator.genFailResult("DB ERROR"); } } @ApiOperation(value = "修改管理员信息接口") @RequestMapping(value = "/users/admin/name", method = RequestMethod.PUT) public Result nameUpdate(@RequestBody @Valid UpdateAdminNameParam adminNameParam, @TokenToAdminUser AdminUserToken adminUser) { logger.info("adminUser:{}", adminUser.toString()); if (adminUserService.updateName(adminUser.getAdminUserId(), adminNameParam.getLoginUserName(), adminNameParam.getNickName())) { return ResultGenerator.genSuccessResult(); } else { return ResultGenerator.genFailResult("DB ERROR"); } } @ApiOperation(value = "管理员退出登录的接口") @RequestMapping(value = "/users/admin/logout", method = RequestMethod.DELETE) public Result logout(@TokenToAdminUser AdminUserToken adminUser) { logger.info("adminUser:{}", adminUser.toString()); adminUserService.logout(adminUser.getToken()); return ResultGenerator.genSuccessResult(); } @ApiOperation(value = "根据token获取管理员信息的接口", notes = "OpenFeign调用") @RequestMapping(value = "/users/admin/{token}", method = RequestMethod.GET) public Result getAdminUserByToken(@PathVariable("token") String token) { AdminUser adminUser = adminUserService.getUserDetailByToken(token); if (adminUser != null) { adminUser.setLoginPassword("******"); Result result = ResultGenerator.genSuccessResult(); result.setData(adminUser); return result; } return ResultGenerator.genFailResult("无此用户数据"); } } ================================================ FILE: newbee-mall-cloud-user-service/newbee-mall-cloud-user-web/src/main/java/ltd/user/cloud/newbee/controller/NewBeeMallCloudPersonalController.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.user.cloud.newbee.controller; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import ltd.common.cloud.newbee.enums.ServiceResultEnum; import ltd.common.cloud.newbee.dto.Result; import ltd.common.cloud.newbee.dto.ResultGenerator; import ltd.common.cloud.newbee.pojo.MallUserToken; import ltd.common.cloud.newbee.util.BeanUtil; import ltd.common.cloud.newbee.util.NumberUtil; import ltd.user.cloud.newbee.config.annotation.TokenToMallUser; import ltd.user.cloud.newbee.controller.param.MallUserLoginParam; import ltd.user.cloud.newbee.controller.param.MallUserRegisterParam; import ltd.user.cloud.newbee.controller.param.MallUserUpdateParam; import ltd.user.cloud.newbee.controller.vo.NewBeeMallUserVO; import ltd.user.cloud.newbee.entity.MallUser; import ltd.user.cloud.newbee.service.NewBeeMallUserService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.validation.Valid; @RestController @Api(value = "v1", tags = "新蜂商城用户操作相关接口") @RequestMapping("/users/mall") public class NewBeeMallCloudPersonalController { @Resource private NewBeeMallUserService newBeeMallUserService; private static final Logger logger = LoggerFactory.getLogger(NewBeeMallCloudPersonalController.class); @PostMapping("/login") @ApiOperation(value = "登录接口", notes = "返回token") public Result login(@RequestBody @Valid MallUserLoginParam mallUserLoginParam) { if (!NumberUtil.isPhone(mallUserLoginParam.getLoginName())){ return ResultGenerator.genFailResult(ServiceResultEnum.LOGIN_NAME_IS_NOT_PHONE.getResult()); } String loginResult = newBeeMallUserService.login(mallUserLoginParam.getLoginName(), mallUserLoginParam.getPasswordMd5()); logger.info("login api,loginName={},loginResult={}", mallUserLoginParam.getLoginName(), loginResult); //登录成功 if (StringUtils.hasText(loginResult) && loginResult.length() == 32) { Result result = ResultGenerator.genSuccessResult(); result.setData(loginResult); return result; } //登录失败 return ResultGenerator.genFailResult(loginResult); } @PostMapping("/logout") @ApiOperation(value = "登出接口", notes = "清除token") public Result logout(@TokenToMallUser MallUserToken loginMallUserToken) { Boolean logoutResult = newBeeMallUserService.logout(loginMallUserToken.getToken()); logger.info("logout api,loginMallUser={}", loginMallUserToken.getUserId()); //登出成功 if (logoutResult) { return ResultGenerator.genSuccessResult(); } //登出失败 return ResultGenerator.genFailResult("logout error"); } @PostMapping("/register") @ApiOperation(value = "用户注册", notes = "") public Result register(@RequestBody @Valid MallUserRegisterParam mallUserRegisterParam) { if (!NumberUtil.isPhone(mallUserRegisterParam.getLoginName())){ return ResultGenerator.genFailResult(ServiceResultEnum.LOGIN_NAME_IS_NOT_PHONE.getResult()); } String registerResult = newBeeMallUserService.register(mallUserRegisterParam.getLoginName(), mallUserRegisterParam.getPassword()); logger.info("register api,loginName={},loginResult={}", mallUserRegisterParam.getLoginName(), registerResult); //注册成功 if (ServiceResultEnum.SUCCESS.getResult().equals(registerResult)) { return ResultGenerator.genSuccessResult(); } //注册失败 return ResultGenerator.genFailResult(registerResult); } @PutMapping("/update") @ApiOperation(value = "修改用户信息", notes = "") public Result updateInfo(@RequestBody @ApiParam("用户信息") MallUserUpdateParam mallUserUpdateParam, @TokenToMallUser MallUserToken loginMallUserToken) { Boolean flag = newBeeMallUserService.updateUserInfo(mallUserUpdateParam, loginMallUserToken.getUserId()); if (flag) { //返回成功 Result result = ResultGenerator.genSuccessResult(); return result; } else { //返回失败 Result result = ResultGenerator.genFailResult("修改失败"); return result; } } @GetMapping("/detail") @ApiOperation(value = "获取用户信息", notes = "") public Result getUserDetail(@TokenToMallUser MallUserToken loginMallUserToken) { NewBeeMallUserVO mallUserVO = new NewBeeMallUserVO(); MallUser userDetailByToken = newBeeMallUserService.getUserDetailByToken(loginMallUserToken.getToken()); BeanUtil.copyProperties(userDetailByToken, mallUserVO); return ResultGenerator.genSuccessResult(mallUserVO); } @RequestMapping(value = "/getDetailByToken", method = RequestMethod.GET) public Result getMallUserByToken(@RequestParam("token") String token) { MallUser userDetailByToken = newBeeMallUserService.getUserDetailByToken(token); if (userDetailByToken != null) { Result result = ResultGenerator.genSuccessResult(); result.setData(userDetailByToken); return result; } return ResultGenerator.genFailResult("无此用户数据"); } } ================================================ FILE: newbee-mall-cloud-user-service/newbee-mall-cloud-user-web/src/main/java/ltd/user/cloud/newbee/controller/param/AdminLoginParam.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.user.cloud.newbee.controller.param; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotEmpty; import java.io.Serializable; @Data public class AdminLoginParam implements Serializable { @ApiModelProperty("登录名") @NotEmpty(message = "登录名不能为空") private String userName; @ApiModelProperty("用户密码(需要MD5加密)") @NotEmpty(message = "密码不能为空") private String passwordMd5; } ================================================ FILE: newbee-mall-cloud-user-service/newbee-mall-cloud-user-web/src/main/java/ltd/user/cloud/newbee/controller/param/MallUserLoginParam.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.user.cloud.newbee.controller.param; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotEmpty; import java.io.Serializable; /** * 用户登录param */ @Data public class MallUserLoginParam implements Serializable { @ApiModelProperty("登录名") @NotEmpty(message = "登录名不能为空") private String loginName; @ApiModelProperty("用户密码(需要MD5加密)") @NotEmpty(message = "密码不能为空") private String passwordMd5; } ================================================ FILE: newbee-mall-cloud-user-service/newbee-mall-cloud-user-web/src/main/java/ltd/user/cloud/newbee/controller/param/MallUserRegisterParam.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.user.cloud.newbee.controller.param; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotEmpty; import java.io.Serializable; /** * 用户注册param */ @Data public class MallUserRegisterParam implements Serializable { @ApiModelProperty("登录名") @NotEmpty(message = "登录名不能为空") private String loginName; @ApiModelProperty("用户密码") @NotEmpty(message = "密码不能为空") private String password; } ================================================ FILE: newbee-mall-cloud-user-service/newbee-mall-cloud-user-web/src/main/java/ltd/user/cloud/newbee/controller/param/MallUserUpdateParam.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.user.cloud.newbee.controller.param; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; /** * 用户修改param */ @Data public class MallUserUpdateParam implements Serializable { @ApiModelProperty("用户昵称") private String nickName; @ApiModelProperty("用户密码(需要MD5加密)") private String passwordMd5; @ApiModelProperty("个性签名") private String introduceSign; } ================================================ FILE: newbee-mall-cloud-user-service/newbee-mall-cloud-user-web/src/main/java/ltd/user/cloud/newbee/controller/param/UpdateAdminNameParam.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.user.cloud.newbee.controller.param; import lombok.Data; import javax.validation.constraints.NotEmpty; @Data public class UpdateAdminNameParam { @NotEmpty(message = "loginUserName不能为空") private String loginUserName; @NotEmpty(message = "nickName不能为空") private String nickName; } ================================================ FILE: newbee-mall-cloud-user-service/newbee-mall-cloud-user-web/src/main/java/ltd/user/cloud/newbee/controller/param/UpdateAdminPasswordParam.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.user.cloud.newbee.controller.param; import lombok.Data; import javax.validation.constraints.NotEmpty; @Data public class UpdateAdminPasswordParam { @NotEmpty(message = "originalPassword不能为空") private String originalPassword; @NotEmpty(message = "newPassword不能为空") private String newPassword; } ================================================ FILE: newbee-mall-cloud-user-service/newbee-mall-cloud-user-web/src/main/java/ltd/user/cloud/newbee/controller/vo/NewBeeMallUserVO.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.user.cloud.newbee.controller.vo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; @Data public class NewBeeMallUserVO implements Serializable { @ApiModelProperty("用户昵称") private String nickName; @ApiModelProperty("用户登录名") private String loginName; @ApiModelProperty("个性签名") private String introduceSign; } ================================================ FILE: newbee-mall-cloud-user-service/newbee-mall-cloud-user-web/src/main/java/ltd/user/cloud/newbee/dao/AdminUserMapper.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本系统已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.user.cloud.newbee.dao; import ltd.user.cloud.newbee.entity.AdminUser; import org.apache.ibatis.annotations.Param; public interface AdminUserMapper { int insert(AdminUser record); int insertSelective(AdminUser record); /** * 登陆方法 * * @param userName * @param password * @return */ AdminUser login(@Param("userName") String userName, @Param("password") String password); AdminUser selectByPrimaryKey(Long adminUserId); int updateByPrimaryKeySelective(AdminUser record); int updateByPrimaryKey(AdminUser record); } ================================================ FILE: newbee-mall-cloud-user-service/newbee-mall-cloud-user-web/src/main/java/ltd/user/cloud/newbee/dao/MallUserMapper.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.user.cloud.newbee.dao; import ltd.common.cloud.newbee.dto.PageQueryUtil; import ltd.user.cloud.newbee.entity.MallUser; import org.apache.ibatis.annotations.Param; import java.util.List; public interface MallUserMapper { int deleteByPrimaryKey(Long userId); int insert(MallUser record); int insertSelective(MallUser record); MallUser selectByPrimaryKey(Long userId); MallUser selectByLoginName(String loginName); MallUser selectByLoginNameAndPasswd(@Param("loginName") String loginName, @Param("password") String password); int updateByPrimaryKeySelective(MallUser record); int updateByPrimaryKey(MallUser record); List findMallUserList(PageQueryUtil pageUtil); int getTotalMallUsers(PageQueryUtil pageUtil); int lockUserBatch(@Param("ids") Long[] ids, @Param("lockStatus") int lockStatus); } ================================================ FILE: newbee-mall-cloud-user-service/newbee-mall-cloud-user-web/src/main/java/ltd/user/cloud/newbee/entity/AdminUser.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本系统已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.user.cloud.newbee.entity; import lombok.Data; @Data public class AdminUser { private Long adminUserId; private String loginUserName; private String loginPassword; private String nickName; private Byte locked; } ================================================ FILE: newbee-mall-cloud-user-service/newbee-mall-cloud-user-web/src/main/java/ltd/user/cloud/newbee/entity/MallUser.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.user.cloud.newbee.entity; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import java.util.Date; @Data public class MallUser { private Long userId; private String nickName; private String loginName; private String passwordMd5; private String introduceSign; private Byte isDeleted; private Byte lockedFlag; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date createTime; } ================================================ FILE: newbee-mall-cloud-user-service/newbee-mall-cloud-user-web/src/main/java/ltd/user/cloud/newbee/service/AdminUserService.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本系统已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.user.cloud.newbee.service; import ltd.user.cloud.newbee.entity.AdminUser; public interface AdminUserService { /** * 登录 * @param userName * @param password * @return */ String login(String userName, String password); /** * 获取用户信息 * * @param loginUserId * @return */ AdminUser getUserDetailById(Long loginUserId); /** * 获取用户信息 by token * * @param token * @return */ AdminUser getUserDetailByToken(String token); /** * 修改当前登录用户的密码 * * @param loginUserId * @param originalPassword * @param newPassword * @return */ Boolean updatePassword(Long loginUserId, String originalPassword, String newPassword); /** * 修改当前登录用户的名称信息 * * @param loginUserId * @param loginUserName * @param nickName * @return */ Boolean updateName(Long loginUserId, String loginUserName, String nickName); /** * 登出接口 * @param token * @return */ Boolean logout(String token); } ================================================ FILE: newbee-mall-cloud-user-service/newbee-mall-cloud-user-web/src/main/java/ltd/user/cloud/newbee/service/NewBeeMallUserService.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.user.cloud.newbee.service; import ltd.common.cloud.newbee.dto.PageQueryUtil; import ltd.common.cloud.newbee.dto.PageResult; import ltd.user.cloud.newbee.controller.param.MallUserUpdateParam; import ltd.user.cloud.newbee.entity.AdminUser; import ltd.user.cloud.newbee.entity.MallUser; public interface NewBeeMallUserService { /** * 用户注册 * * @param loginName * @param password * @return */ String register(String loginName, String password); /** * 登录 * * @param loginName * @param passwordMD5 * @return */ String login(String loginName, String passwordMD5); /** * 用户信息修改 * * @param mallUser * @return */ Boolean updateUserInfo(MallUserUpdateParam mallUser, Long userId); /** * 获取用户信息 by token * * @param token * @return */ MallUser getUserDetailByToken(String token); /** * 登出接口 * @param token * @return */ Boolean logout(String token); /** * 用户禁用与解除禁用(0-未锁定 1-已锁定) * * @param ids * @param lockStatus * @return */ Boolean lockUsers(Long[] ids, int lockStatus); /** * 后台分页 * * @param pageUtil * @return */ PageResult getNewBeeMallUsersPage(PageQueryUtil pageUtil); } ================================================ FILE: newbee-mall-cloud-user-service/newbee-mall-cloud-user-web/src/main/java/ltd/user/cloud/newbee/service/impl/AdminUserServiceImpl.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本系统已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.user.cloud.newbee.service.impl; import ltd.common.cloud.newbee.util.NumberUtil; import ltd.common.cloud.newbee.util.SystemUtil; import ltd.user.cloud.newbee.dao.AdminUserMapper; import ltd.user.cloud.newbee.entity.AdminUser; import ltd.common.cloud.newbee.pojo.AdminUserToken; import ltd.user.cloud.newbee.service.AdminUserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ValueOperations; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.concurrent.TimeUnit; @Service public class AdminUserServiceImpl implements AdminUserService { @Resource private AdminUserMapper adminUserMapper; @Autowired private RedisTemplate redisTemplate; @Override public String login(String userName, String password) { AdminUser loginAdminUser = adminUserMapper.login(userName, password); if (loginAdminUser != null) { //登录后即执行修改token的操作 String token = getNewToken(System.currentTimeMillis() + "", loginAdminUser.getAdminUserId()); AdminUserToken adminUserToken = new AdminUserToken(); adminUserToken.setAdminUserId(loginAdminUser.getAdminUserId()); adminUserToken.setToken(token); ValueOperations setToken = redisTemplate.opsForValue(); setToken.set(token, adminUserToken, 2 * 24 * 60 * 60, TimeUnit.SECONDS);//过期时间 48 小时 return token; } return "登录失败"; } /** * 获取token值 * * @param timeStr * @param userId * @return */ private String getNewToken(String timeStr, Long userId) { String src = timeStr + userId + NumberUtil.genRandomNum(6); return SystemUtil.genToken(src); } @Override public AdminUser getUserDetailById(Long loginUserId) { return adminUserMapper.selectByPrimaryKey(loginUserId); } @Override public AdminUser getUserDetailByToken(String token) { ValueOperations opsForAdminUserToken = redisTemplate.opsForValue(); AdminUserToken adminUserToken = opsForAdminUserToken.get(token); if (adminUserToken != null) { return adminUserMapper.selectByPrimaryKey(adminUserToken.getAdminUserId()); } return null; } @Override public Boolean updatePassword(Long loginUserId, String originalPassword, String newPassword) { AdminUser adminUser = adminUserMapper.selectByPrimaryKey(loginUserId); //当前用户非空才可以进行更改 if (adminUser != null) { //比较原密码是否正确 if (originalPassword.equals(adminUser.getLoginPassword())) { //设置新密码并修改 adminUser.setLoginPassword(newPassword); if (adminUserMapper.updateByPrimaryKeySelective(adminUser) > 0) { //修改成功且清空当前token则返回true return true; } } } return false; } @Override public Boolean updateName(Long loginUserId, String loginUserName, String nickName) { AdminUser adminUser = adminUserMapper.selectByPrimaryKey(loginUserId); //当前用户非空才可以进行更改 if (adminUser != null) { //设置新名称并修改 adminUser.setLoginUserName(loginUserName); adminUser.setNickName(nickName); if (adminUserMapper.updateByPrimaryKeySelective(adminUser) > 0) { //修改成功则返回true return true; } } return false; } @Override public Boolean logout(String token) { redisTemplate.delete(token); return true; } } ================================================ FILE: newbee-mall-cloud-user-service/newbee-mall-cloud-user-web/src/main/java/ltd/user/cloud/newbee/service/impl/NewBeeMallUserServiceImpl.java ================================================ /** * 严肃声明: * 开源版本请务必保留此注释头信息,若删除我方将保留所有法律责任追究! * 本软件已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! * 可正常分享和学习源码,不得用于违法犯罪活动,违者必究! * Copyright (c) 2022 程序员十三 all rights reserved. * 版权所有,侵权必究! */ package ltd.user.cloud.newbee.service.impl; import ltd.common.cloud.newbee.enums.ServiceResultEnum; import ltd.common.cloud.newbee.dto.PageQueryUtil; import ltd.common.cloud.newbee.dto.PageResult; import ltd.common.cloud.newbee.exception.NewBeeMallException; import ltd.common.cloud.newbee.pojo.MallUserToken; import ltd.common.cloud.newbee.util.MD5Util; import ltd.common.cloud.newbee.util.NumberUtil; import ltd.common.cloud.newbee.util.SystemUtil; import ltd.user.cloud.newbee.controller.param.MallUserUpdateParam; import ltd.user.cloud.newbee.dao.MallUserMapper; import ltd.user.cloud.newbee.entity.MallUser; import ltd.user.cloud.newbee.service.NewBeeMallUserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ValueOperations; import org.springframework.stereotype.Service; import java.util.List; import java.util.concurrent.TimeUnit; @Service public class NewBeeMallUserServiceImpl implements NewBeeMallUserService { @Autowired private MallUserMapper mallUserMapper; @Autowired private RedisTemplate redisTemplate; @Override public String register(String loginName, String password) { if (mallUserMapper.selectByLoginName(loginName) != null) { return ServiceResultEnum.SAME_LOGIN_NAME_EXIST.getResult(); } MallUser registerUser = new MallUser(); registerUser.setLoginName(loginName); registerUser.setNickName(loginName); registerUser.setIntroduceSign("随新所欲,蜂富多彩"); String passwordMD5 = MD5Util.MD5Encode(password, "UTF-8"); registerUser.setPasswordMd5(passwordMD5); if (mallUserMapper.insertSelective(registerUser) > 0) { return ServiceResultEnum.SUCCESS.getResult(); } return ServiceResultEnum.DB_ERROR.getResult(); } @Override public String login(String loginName, String passwordMD5) { MallUser user = mallUserMapper.selectByLoginNameAndPasswd(loginName, passwordMD5); if (user != null) { if (user.getLockedFlag() == 1) { return ServiceResultEnum.LOGIN_USER_LOCKED_ERROR.getResult(); } //登录后即执行修改token的操作 String token = getNewToken(System.currentTimeMillis() + "", user.getUserId()); MallUserToken mallUserToken = new MallUserToken(); mallUserToken.setUserId(user.getUserId()); mallUserToken.setToken(token); ValueOperations setToken = redisTemplate.opsForValue(); setToken.set(token, mallUserToken, 7 * 24 * 60 * 60, TimeUnit.SECONDS);//过期时间7天 return token; } return ServiceResultEnum.LOGIN_ERROR.getResult(); } /** * 获取token值 * * @param timeStr * @param userId * @return */ private String getNewToken(String timeStr, Long userId) { String src = timeStr + userId + NumberUtil.genRandomNum(4); return SystemUtil.genToken(src); } @Override public Boolean updateUserInfo(MallUserUpdateParam mallUser, Long userId) { MallUser user = mallUserMapper.selectByPrimaryKey(userId); if (user == null) { NewBeeMallException.fail(ServiceResultEnum.DATA_NOT_EXIST.getResult()); } user.setNickName(mallUser.getNickName()); //若密码为空字符,则表明用户不打算修改密码,使用原密码保存 if (!MD5Util.MD5Encode("", "UTF-8").equals(mallUser.getPasswordMd5())) { user.setPasswordMd5(mallUser.getPasswordMd5()); } user.setIntroduceSign(mallUser.getIntroduceSign()); if (mallUserMapper.updateByPrimaryKeySelective(user) > 0) { return true; } return false; } @Override public MallUser getUserDetailByToken(String token) { ValueOperations opsForMallUserToken = redisTemplate.opsForValue(); MallUserToken mallUserToken = opsForMallUserToken.get(token); if (mallUserToken != null) { MallUser mallUser = mallUserMapper.selectByPrimaryKey(mallUserToken.getUserId()); if (mallUser == null) { NewBeeMallException.fail(ServiceResultEnum.DATA_NOT_EXIST.getResult()); } if (mallUser.getLockedFlag().intValue() == 1) { NewBeeMallException.fail(ServiceResultEnum.LOGIN_USER_LOCKED_ERROR.getResult()); } return mallUser; } NewBeeMallException.fail(ServiceResultEnum.DATA_NOT_EXIST.getResult()); return null; } @Override public Boolean logout(String token) { redisTemplate.delete(token); return true; } @Override public PageResult getNewBeeMallUsersPage(PageQueryUtil pageUtil) { List mallUsers = mallUserMapper.findMallUserList(pageUtil); int total = mallUserMapper.getTotalMallUsers(pageUtil); PageResult pageResult = new PageResult(mallUsers, total, pageUtil.getLimit(), pageUtil.getPage()); return pageResult; } @Override public Boolean lockUsers(Long[] ids, int lockStatus) { if (ids.length < 1) { return false; } return mallUserMapper.lockUserBatch(ids, lockStatus) > 0; } } ================================================ FILE: newbee-mall-cloud-user-service/newbee-mall-cloud-user-web/src/main/resources/application.properties ================================================ server.port=29000 # 服务名称 spring.application.name=newbee-mall-cloud-user-service # Nacos地址 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 # Nacos登录用户名(默认为nacos,生产环境一定要修改) spring.cloud.nacos.username=nacos # Nacos登录密码(默认为nacos,生产环境一定要修改) spring.cloud.nacos.password=nacos # datasource config (MySQL) spring.datasource.name=newbee-mall-cloud-user-datasource spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/newbee_mall_cloud_user_db?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=utf8&autoReconnect=true&useSSL=false&allowMultiQueries=true spring.datasource.username=root spring.datasource.password=123456 spring.datasource.hikari.minimum-idle=5 spring.datasource.hikari.maximum-pool-size=15 spring.datasource.hikari.auto-commit=true spring.datasource.hikari.idle-timeout=60000 spring.datasource.hikari.pool-name=hikariCP spring.datasource.hikari.max-lifetime=600000 spring.datasource.hikari.connection-timeout=30000 spring.datasource.hikari.connection-test-query=SELECT 1 # mybatis config mybatis.mapper-locations=classpath:mapper/*Mapper.xml # sentinel config spring.cloud.sentinel.transport.port=8900 spring.cloud.sentinel.transport.clientIp=127.0.0.1 # 指定Sentinel控制台地址 spring.cloud.sentinel.transport.dashboard=127.0.0.1:9113 ##Redis 配置 # Redis数据库索引(默认为0) spring.redis.database=13 # Redis服务器地址 spring.redis.host=127.0.0.1 # Redis服务器连接端口 spring.redis.port=6379 # Redis服务器连接密码 spring.redis.password=123456789 # 连接池最大连接数(使用负值表示没有限制) spring.redis.jedis.pool.max-active=8 # 连接池最大阻塞等待时间(使用负值表示没有限制) spring.redis.jedis.pool.max-wait=-1 # 连接池中的最大空闲连接 spring.redis.jedis.pool.max-idle=8 # 连接池中的最小空闲连接 spring.redis.jedis.pool.min-idle=0 # 连接超时时间(毫秒) spring.redis.timeout=5000 # 演示需要,开启当前项目中的 debug 级别日志 logging.level.ltd.user.cloud.newbee=debug # Sleuth采样率,取值范围为[0.1,1.0],值越大收集越及时,但性能影响也越大 spring.sleuth.sampler.probability=1.0 # 每秒数据采集量,最多n条/秒Trace spring.sleuth.sampler.rate=500 spring.zipkin.base-url=http://localhost:9411 ================================================ FILE: newbee-mall-cloud-user-service/newbee-mall-cloud-user-web/src/main/resources/logback.xml ================================================ ${APP_NAME} INFO ${CONSOLE_LOG_PATTERN} utf8 192.168.110.57:4560 INFO ================================================ FILE: newbee-mall-cloud-user-service/newbee-mall-cloud-user-web/src/main/resources/mapper/AdminUserMapper.xml ================================================ admin_user_id, login_user_name, login_password, nick_name, locked insert into tb_newbee_mall_admin_user (admin_user_id, login_user_name, login_password, nick_name, locked) values (#{adminUserId,jdbcType=BIGINT}, #{loginUserName,jdbcType=VARCHAR}, #{loginPassword,jdbcType=VARCHAR}, #{nickName,jdbcType=VARCHAR}, #{locked,jdbcType=TINYINT}) insert into tb_newbee_mall_admin_user admin_user_id, login_user_name, login_password, nick_name, locked, #{adminUserId,jdbcType=BIGINT}, #{loginUserName,jdbcType=VARCHAR}, #{loginPassword,jdbcType=VARCHAR}, #{nickName,jdbcType=VARCHAR}, #{locked,jdbcType=TINYINT}, update tb_newbee_mall_admin_user login_user_name = #{loginUserName,jdbcType=VARCHAR}, login_password = #{loginPassword,jdbcType=VARCHAR}, nick_name = #{nickName,jdbcType=VARCHAR}, locked = #{locked,jdbcType=TINYINT}, where admin_user_id = #{adminUserId,jdbcType=BIGINT} update tb_newbee_mall_admin_user set login_user_name = #{loginUserName,jdbcType=VARCHAR}, login_password = #{loginPassword,jdbcType=VARCHAR}, nick_name = #{nickName,jdbcType=VARCHAR}, locked = #{locked,jdbcType=TINYINT} where admin_user_id = #{adminUserId,jdbcType=BIGINT} ================================================ FILE: newbee-mall-cloud-user-service/newbee-mall-cloud-user-web/src/main/resources/mapper/MallUserMapper.xml ================================================ user_id, nick_name, login_name, password_md5, introduce_sign, is_deleted, locked_flag, create_time update tb_newbee_mall_user set is_deleted = 1 where user_id = #{userId,jdbcType=BIGINT} and is_deleted = 0 insert into tb_newbee_mall_user (user_id, nick_name, login_name, password_md5, introduce_sign, is_deleted, locked_flag, create_time ) values (#{userId,jdbcType=BIGINT}, #{nickName,jdbcType=VARCHAR}, #{loginName,jdbcType=VARCHAR}, #{passwordMd5,jdbcType=VARCHAR}, #{introduceSign,jdbcType=VARCHAR}, #{isDeleted,jdbcType=TINYINT}, #{lockedFlag,jdbcType=TINYINT}, #{createTime,jdbcType=TIMESTAMP} ) insert into tb_newbee_mall_user user_id, nick_name, login_name, password_md5, introduce_sign, is_deleted, locked_flag, create_time, #{userId,jdbcType=BIGINT}, #{nickName,jdbcType=VARCHAR}, #{loginName,jdbcType=VARCHAR}, #{passwordMd5,jdbcType=VARCHAR}, #{introduceSign,jdbcType=VARCHAR}, #{isDeleted,jdbcType=TINYINT}, #{lockedFlag,jdbcType=TINYINT}, #{createTime,jdbcType=TIMESTAMP}, update tb_newbee_mall_user nick_name = #{nickName,jdbcType=VARCHAR}, login_name = #{loginName,jdbcType=VARCHAR}, password_md5 = #{passwordMd5,jdbcType=VARCHAR}, introduce_sign = #{introduceSign,jdbcType=VARCHAR}, is_deleted = #{isDeleted,jdbcType=TINYINT}, locked_flag = #{lockedFlag,jdbcType=TINYINT}, create_time = #{createTime,jdbcType=TIMESTAMP}, where user_id = #{userId,jdbcType=BIGINT} update tb_newbee_mall_user set nick_name = #{nickName,jdbcType=VARCHAR}, login_name = #{loginName,jdbcType=VARCHAR}, password_md5 = #{passwordMd5,jdbcType=VARCHAR}, introduce_sign = #{introduceSign,jdbcType=VARCHAR}, is_deleted = #{isDeleted,jdbcType=TINYINT}, locked_flag = #{lockedFlag,jdbcType=TINYINT}, create_time = #{createTime,jdbcType=TIMESTAMP} where user_id = #{userId,jdbcType=BIGINT} update tb_newbee_mall_user set locked_flag=#{lockStatus} where user_id in #{id} ================================================ FILE: newbee-mall-cloud-user-service/pom.xml ================================================ 4.0.0 ltd.newbee.cloud newbee-mall-cloud-user-service 0.0.1-SNAPSHOT pom newbee-mall-cloud-user-service 用户模块 ltd.newbee.cloud newbee-mall-cloud 0.0.1-SNAPSHOT 1.8 newbee-mall-cloud-user-web newbee-mall-cloud-user-api ================================================ FILE: pom.xml ================================================ 4.0.0 ltd.newbee.cloud newbee-mall-cloud 0.0.1-SNAPSHOT newbee-mall-cloud pom 新蜂商城微服务版本(Spring Cloud Alibaba) newbee-mall-cloud-order-service newbee-mall-cloud-shop-cart-service newbee-mall-cloud-recommend-service newbee-mall-cloud-goods-service newbee-mall-cloud-user-service newbee-mall-cloud-gateway-mall newbee-mall-cloud-gateway-admin newbee-mall-cloud-common 2.6.3 2021.0.1 2021.0.1.0 2.2.2 3.0.0 1.18.16 1.8 7.0.1 UTF-8 UTF-8 org.springframework.cloud spring-cloud-dependencies ${spring.cloud.dependencies.version} pom import org.springframework.boot spring-boot-dependencies ${spring.boot.version} pom import com.alibaba.cloud spring-cloud-alibaba-dependencies ${spring.cloud.alibaba.version} pom import org.springframework.boot spring-boot-starter-web ${spring.boot.version} org.springframework.boot spring-boot-starter-test ${spring.boot.version} org.mybatis.spring.boot mybatis-spring-boot-starter ${mybatis.starter.version} io.springfox springfox-boot-starter ${swagger.version} org.projectlombok lombok ${lombok.version} provided org.apache.maven.plugins maven-compiler-plugin 3.8.0 ${java.version} ${java.version} UTF-8 org.springframework.boot spring-boot-maven-plugin ${spring.boot.version} central https://maven.aliyun.com/repository/central aliyun ================================================ FILE: static-files/newbee_mall_cloud_cart_db.sql ================================================ # 创建购物车服务所需数据 CREATE DATABASE /*!32312 IF NOT EXISTS*/`newbee_mall_cloud_cart_db` /*!40100 DEFAULT CHARACTER SET utf8 */; USE `newbee_mall_cloud_cart_db`; DROP TABLE IF EXISTS `tb_newbee_mall_shopping_cart_item`; CREATE TABLE `tb_newbee_mall_shopping_cart_item` ( `cart_item_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '购物项主键id', `user_id` bigint(20) NOT NULL COMMENT '用户主键id', `goods_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '关联商品id', `goods_count` int(11) NOT NULL DEFAULT '1' COMMENT '数量(最大为5)', `is_deleted` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标识字段(0-未删除 1-已删除)', `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最新修改时间', PRIMARY KEY (`cart_item_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- for AT mode you must to init this sql for you business database. the seata server not need it. CREATE TABLE IF NOT EXISTS `undo_log` ( `branch_id` BIGINT NOT NULL COMMENT 'branch transaction id', `xid` VARCHAR(128) NOT NULL COMMENT 'global transaction id', `context` VARCHAR(128) NOT NULL COMMENT 'undo_log context,such as serialization', `rollback_info` LONGBLOB NOT NULL COMMENT 'rollback info', `log_status` INT(11) NOT NULL COMMENT '0:normal status,1:defense status', `log_created` DATETIME(6) NOT NULL COMMENT 'create datetime', `log_modified` DATETIME(6) NOT NULL COMMENT 'modify datetime', UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`) ) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8mb4 COMMENT ='AT transaction mode undo table'; ================================================ FILE: static-files/newbee_mall_cloud_goods_db.sql ================================================ # 创建商品服务所需数据 CREATE DATABASE /*!32312 IF NOT EXISTS*/`newbee_mall_cloud_goods_db` /*!40100 DEFAULT CHARACTER SET utf8 */; USE `newbee_mall_cloud_goods_db`; # 创建商品分类表 DROP TABLE IF EXISTS `tb_newbee_mall_goods_category`; CREATE TABLE `tb_newbee_mall_goods_category` ( `category_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '分类id', `category_level` tinyint(4) NOT NULL DEFAULT '0' COMMENT '分类级别(1-一级分类 2-二级分类 3-三级分类)', `parent_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '父分类id', `category_name` varchar(50) NOT NULL DEFAULT '' COMMENT '分类名称', `category_rank` int(11) NOT NULL DEFAULT '0' COMMENT '排序值(字段越大越靠前)', `is_deleted` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标识字段(0-未删除 1-已删除)', `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `create_user` int(11) NOT NULL DEFAULT '0' COMMENT '创建者id', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', `update_user` int(11) DEFAULT '0' COMMENT '修改者id', PRIMARY KEY (`category_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC; # 新增商品分类数据 INSERT INTO tb_newbee_mall_goods_category (category_level, parent_id, category_name, category_rank, is_deleted, create_time, create_user, update_time, update_user) VALUES (1, 0, '家电 数码 手机', 100, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (1, 0, '女装 男装 穿搭', 99, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (2, 15, '家电', 10, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (2, 15, '数码', 9, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (2, 15, '手机', 8, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 17, '生活电器', 0, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 17, '厨房电器', 0, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 17, '扫地机器人', 0, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 17, '吸尘器', 0, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 17, '取暖器', 0, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 17, '豆浆机', 0, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 17, '暖风机', 0, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 17, '加湿器', 0, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 17, '蓝牙音箱', 0, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 17, '烤箱', 0, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 17, '卷发器', 0, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 17, '空气净化器', 0, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 18, '游戏主机', 0, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 18, '数码精选', 0, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 18, '平板电脑', 0, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 18, '苹果 Apple', 0, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 18, '电脑主机', 0, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 18, '数码相机', 0, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 18, '电玩动漫', 0, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 18, '单反相机', 0, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 18, '键盘鼠标', 0, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 18, '无人机', 0, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 18, '二手电脑', 0, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 18, '二手手机', 0, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 19, 'iPhone 11', 89, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 19, '荣耀手机', 99, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 19, '华为手机', 98, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 19, '苹果 iPhone', 88, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 19, '华为 Mate 20', 79, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 19, '华为 P30', 97, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 19, '华为 P30 Pro', 0, 1, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 19, '小米手机', 0, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 19, '红米', 0, 1, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 19, 'OPPO', 0, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 19, '一加', 0, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 19, '小米 MIX', 0, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 19, 'Reno', 0, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 19, 'vivo', 0, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 19, '手机以旧换新', 0, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (1, 0, '运动 户外 乐器', 97, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (1, 0, '游戏 动漫 影视', 96, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (1, 0, '家具 家饰 家纺', 98, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (1, 0, '美妆 清洁 宠物', 94, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (1, 0, '工具 装修 建材', 93, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (1, 0, 'test12', 0, 1, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (1, 0, '玩具 孕产 用品', 0, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (1, 0, '鞋靴 箱包 配件', 91, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (2, 16, '女装', 10, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (2, 16, '男装', 9, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (2, 16, '穿搭', 8, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (2, 61, '家具', 10, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (2, 61, '家饰', 9, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (2, 61, '家纺', 8, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (2, 59, '运动', 10, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (2, 59, '户外', 9, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (2, 59, '乐器', 8, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 67, '外套', 10, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 70, '沙发', 10, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 73, '跑鞋', 10, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (2, 60, '游戏', 10, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (2, 60, '动漫', 9, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (2, 60, '影视', 8, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 79, 'LOL', 10, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (2, 62, '美妆', 10, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (2, 62, '宠物', 9, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (2, 62, '清洁', 8, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 83, '口红', 10, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (2, 63, '工具', 10, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (2, 63, '装修', 9, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (2, 63, '建材', 8, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 87, '转换器', 10, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (2, 64, '珠宝', 10, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (2, 64, '金饰', 9, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (2, 64, '眼镜', 8, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 91, '钻石', 10, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (2, 66, '鞋靴', 10, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (2, 66, '箱包', 9, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (2, 66, '配件', 8, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 95, '休闲鞋', 10, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 83, '气垫', 0, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 83, '美白', 0, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 83, '隔离霜', 0, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 83, '粉底', 0, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 83, '腮红', 0, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 83, '睫毛膏', 0, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 83, '香水', 0, 1, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 83, '面膜', 0, 1, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (1, 0, '2344', 1, 1, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (1, 0, '测试分类', 50, 1, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (2, 15, 'xxx', 0, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 17, 'wer', 0, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (1, 0, '测试分类2', 255, 1, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (2, 111, '测试分类2-1', 0, 1, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (1, 0, '商品类目1', 200, 1, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (1, 0, '商品类目1', 200, 1, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (2, 65, '玩具', 0, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (3, 115, '机器人', 0, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (1, 0, '测试', 10000, 1, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (1, 1, '你好', 100000, 1, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (1, 1, '1', 22222, 1, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (2, 2, '1', 111111, 0, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (1, 1, '222222', 222222, 1, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (1, 0, '测试', 11111111, 1, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (2, 16, '测试', 222222, 1, '2021-03-08 18:56:00', 0, '2021-03-08 18:56:00', 0), (1, 0, '测试分类', 1, 0, '2021-04-15 17:55:55', 0, '2021-04-15 17:55:55', 0); DROP TABLE IF EXISTS `tb_newbee_mall_goods_info`; # 创建商品表 CREATE TABLE `tb_newbee_mall_goods_info` ( `goods_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '商品表主键id', `goods_name` varchar(200) NOT NULL DEFAULT '' COMMENT '商品名', `goods_intro` varchar(200) NOT NULL DEFAULT '' COMMENT '商品简介', `goods_category_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '关联分类id', `goods_cover_img` varchar(200) NOT NULL DEFAULT '/admin/dist/img/no-img.png' COMMENT '商品主图', `goods_carousel` varchar(500) NOT NULL DEFAULT '/admin/dist/img/no-img.png' COMMENT '商品轮播图', `goods_detail_content` text NOT NULL COMMENT '商品详情', `original_price` int(11) NOT NULL DEFAULT '1' COMMENT '商品价格', `selling_price` int(11) NOT NULL DEFAULT '1' COMMENT '商品实际售价', `stock_num` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '商品库存数量', `tag` varchar(20) NOT NULL DEFAULT '' COMMENT '商品标签', `goods_sell_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '商品上架状态 1-下架 0-上架', `create_user` int(11) NOT NULL DEFAULT '0' COMMENT '添加者主键id', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '商品添加时间', `update_user` int(11) NOT NULL DEFAULT '0' COMMENT '修改者主键id', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '商品修改时间', PRIMARY KEY (`goods_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC; # 新增商品表数据 INSERT INTO tb_newbee_mall_goods_info (goods_id, goods_name, goods_intro, goods_category_id, goods_cover_img, goods_carousel, goods_detail_content, original_price, selling_price, stock_num, tag, goods_sell_status, create_user, create_time, update_user, update_time) VALUES (10003, '无印良品 MUJI 基础润肤化妆水', '滋润型 400ml', 0, '/goods-img/87446ec4-e534-4b49-9f7d-9bea34665284.jpg', '/goods-img/87446ec4-e534-4b49-9f7d-9bea34665284.jpg', '

商品介绍加载中...

', 100, 100, 10000, '', 0, 0, '2019-09-18 13:18:47', 0, '2021-03-15 14:28:56'), (10004, '无印良品 MUJI 柔和洁面泡沫', '120g', 0, '/goods-img/45854bdd-2ca5-423c-a609-3d336d9322b4.jpg', '/goods-img/45854bdd-2ca5-423c-a609-3d336d9322b4.jpg', '

商品介绍加载中...

', 45, 45, 10000, '', 0, 0, '2019-09-18 13:18:47', 0, '2019-09-18 13:18:47'), (10005, '无印良品 MUJI 基础润肤乳液', '高保湿型 200ml', 0, '/goods-img/7614ce78-0ebc-4275-a7cc-d16ad5f5f6ed.jpg', '/goods-img/7614ce78-0ebc-4275-a7cc-d16ad5f5f6ed.jpg', '

商品介绍加载中...

', 83, 83, 10000, '', 0, 0, '2019-09-18 13:18:47', 0, '2019-09-18 13:18:47'), (10006, '无印良品 MUJI 基础润肤乳液', '滋润型 400ml', 0, '/goods-img/ef75879d-3d3e-4bab-888d-1e4036491e11.jpg', '/goods-img/ef75879d-3d3e-4bab-888d-1e4036491e11.jpg', '

商品介绍加载中...

', 100, 100, 10000, '', 0, 0, '2019-09-18 13:18:47', 0, '2019-09-18 13:18:47'), (10007, '无印良品 MUJI 基础润肤化妆水', '高保湿型 400ml', 0, '/goods-img/558422d1-640e-442d-a073-2b2bdd95c4ed.jpg', '/goods-img/558422d1-640e-442d-a073-2b2bdd95c4ed.jpg', '

商品介绍加载中...

', 127, 127, 10000, '', 0, 0, '2019-09-18 13:18:47', 0, '2019-09-18 13:18:47'), (10008, '无印良品 MUJI 基础润肤化妆水', '清爽型 200ml', 0, '/goods-img/89660409-78b7-4d47-ae12-f94b3ce9664b.png', '/goods-img/89660409-78b7-4d47-ae12-f94b3ce9664b.png', '

商品介绍加载中...

', 70, 70, 10000, '', 0, 0, '2019-09-18 13:18:47', 0, '2019-09-18 13:18:47'), (10009, '无印良品 MUJI 男式', '无侧缝法兰绒 睡衣 海军蓝 L', 0, '/goods-img/f172c500-21d0-42e3-95ce-aa9b84a2ef49.jpg', '/goods-img/f172c500-21d0-42e3-95ce-aa9b84a2ef49.jpg', '

商品介绍加载中...

', 398, 199, 10000, '', 0, 0, '2019-09-18 13:18:47', 0, '2019-09-18 13:18:47'), (10010, '无印良品 MUJI 基础润肤洁面泡沫', '200ml', 0, '/goods-img/f87bdee1-ed48-4b49-b701-cc44f26a2699.jpg', '/goods-img/f87bdee1-ed48-4b49-b701-cc44f26a2699.jpg', '

商品介绍加载中...

', 83, 83, 10000, '', 0, 0, '2019-09-18 13:18:47', 0, '2019-09-18 13:18:47'), (10011, '无印良品 MUJI 平衡高保湿化妆水', '新蜂精选', 0, '/goods-img/16230038-bf86-4d4e-a11f-954b9ee4bab2.jpg', '/goods-img/16230038-bf86-4d4e-a11f-954b9ee4bab2.jpg', '

商品介绍加载中...

', 130, 65, 10000, '', 0, 0, '2019-09-18 13:18:47', 0, '2019-09-18 13:18:47'), (10012, '无印良品 MUJI 凝胶墨水圆珠笔', '蓝黑色', 0, '/goods-img/a952ecce-32e7-474e-9c1b-943962e0a580.jpg', '/goods-img/a952ecce-32e7-474e-9c1b-943962e0a580.jpg', '

商品介绍加载中...

', 8, 5, 10000, '', 0, 0, '2019-09-18 13:18:47', 0, '2019-09-18 13:18:47'), (10013, '无印良品 MUJI 平衡保湿乳霜', '50g', 0, '/goods-img/904c8aa1-0257-49e8-ad89-f48d2462db21.jpg', '/goods-img/904c8aa1-0257-49e8-ad89-f48d2462db21.jpg', '

商品介绍加载中...

', 130, 65, 10000, '', 0, 0, '2019-09-18 13:18:47', 0, '2019-09-18 13:18:47'), (10014, '无印良品 MUJI 基础润肤乳液', '清爽型 200ml', 0, '/goods-img/d66b6e0e-48d4-4503-8dd6-43b3c71f52a4.png', '/goods-img/d66b6e0e-48d4-4503-8dd6-43b3c71f52a4.png', '

商品介绍加载中...

', 70, 70, 10000, '', 0, 0, '2019-09-18 13:18:47', 0, '2019-09-18 13:18:47'), (10015, '无印良品 MUJI 平衡洁面泡沫', '100g', 0, '/goods-img/d0d8f6d1-1f2d-49f8-9099-0cdd94833581.jpg', '/goods-img/d0d8f6d1-1f2d-49f8-9099-0cdd94833581.jpg', '

商品介绍加载中...

', 85, 42, 10000, '', 0, 0, '2019-09-18 13:18:47', 0, '2019-09-18 13:18:47'), (10016, '无印良品 MUJI 基础润肤乳液', '滋润型 200ml', 0, '/goods-img/e553f566-5dc4-4648-be58-fd7112a47b10.jpg', '/goods-img/e553f566-5dc4-4648-be58-fd7112a47b10.jpg', '

商品介绍加载中...

', 61, 61, 10000, '', 0, 0, '2019-09-18 13:18:47', 0, '2019-09-18 13:18:47'), (10017, '无印良品 MUJI 便携式香薰机', '新蜂精选', 0, '/goods-img/a9c0d929-6f0b-4bc7-819c-e5015f447a9e.jpg', '/goods-img/a9c0d929-6f0b-4bc7-819c-e5015f447a9e.jpg', '

商品介绍加载中...

', 200, 200, 10000, '', 0, 0, '2019-09-18 13:18:47', 0, '2019-09-18 13:18:47'), (10018, '无印良品 MUJI 女式', '粗棉线条纹长袖T恤 白色*横条 L', 0, '/goods-img/38d5f694-2236-415d-80c8-4a1695e92d4e.jpg', '/goods-img/38d5f694-2236-415d-80c8-4a1695e92d4e.jpg', '

商品介绍加载中...

', 198, 70, 10000, '', 0, 0, '2019-09-18 13:18:47', 0, '2019-09-18 13:18:47'), (10019, '无印良品(MUJI) 聚丙烯化妆盒 1/2', '半透明约150x220x86mm', 0, '/goods-img/f6832ed7-cb01-48ab-987f-cd437b21be80.jpg', '/goods-img/f6832ed7-cb01-48ab-987f-cd437b21be80.jpg', '

商品介绍加载中...

', 30, 30, 10000, '', 0, 0, '2019-09-18 13:18:47', 0, '2019-09-18 13:18:47'), (10020, '无印良品 MUJI 聚丙烯', '笔盒 大/约184*64*25㎜', 0, '/goods-img/6c7f7a0d-4d73-406e-adcc-6f666ce4e2c9.jpg', '/goods-img/6c7f7a0d-4d73-406e-adcc-6f666ce4e2c9.jpg', '

商品介绍加载中...

', 18, 18, 10000, '', 0, 0, '2019-09-18 13:18:47', 0, '2019-09-18 13:18:47'), (10021, '无印良品(MUJI) 无针订书机 其他', '新蜂精选', 0, '/goods-img/cf19de8b-e94e-4513-aecd-a0b5c976b738.jpg', '/goods-img/cf19de8b-e94e-4513-aecd-a0b5c976b738.jpg', '

商品介绍加载中...

', 52, 52, 10000, '', 0, 0, '2019-09-18 13:18:47', 0, '2019-09-18 13:18:47'), (10022, '无印良品 MUJI 塑料橡皮', '黑色 小', 0, '/goods-img/d4f3299d-d526-4a81-ae9f-3b53e735075e.jpg', '/goods-img/d4f3299d-d526-4a81-ae9f-3b53e735075e.jpg', '

商品介绍加载中...

', 4, 4, 10000, '', 0, 0, '2019-09-18 13:18:47', 0, '2019-09-18 13:18:47'), (10023, '无印良品 MUJI 大容量基础乳液/高保湿型', '400ml', 0, '/goods-img/ea92b50a-67ba-4279-a71a-4e52e6a3219c.jpg', '/goods-img/ea92b50a-67ba-4279-a71a-4e52e6a3219c.jpg', '

商品介绍加载中...

', 140, 140, 10000, '', 0, 0, '2019-09-18 13:18:47', 0, '2019-09-18 13:18:47'), (10024, '无印良品 MUJI 基础润肤化妆水', '滋润型 400ml', 0, '/goods-img/beb26b1b-7a73-48c2-a9f7-727ad92401f6.jpg', '/goods-img/beb26b1b-7a73-48c2-a9f7-727ad92401f6.jpg', '

商品介绍加载中...

', 100, 100, 10000, '', 0, 0, '2019-09-18 13:18:52', 0, '2019-09-18 13:18:52'), (10025, '无印良品 MUJI 柔和洁面泡沫', '120g', 0, '/goods-img/bf1dc4d1-acc2-40c8-8091-1c6f35988643.jpg', '/goods-img/bf1dc4d1-acc2-40c8-8091-1c6f35988643.jpg', '

商品介绍加载中...

', 45, 45, 10000, '', 0, 0, '2019-09-18 13:18:52', 0, '2019-09-18 13:18:52'), (10026, '无印良品 MUJI 基础润肤乳液', '高保湿型 200ml', 0, '/goods-img/4059caa9-e0b3-4ac3-a494-b9e4c47e0185.jpg', '/goods-img/4059caa9-e0b3-4ac3-a494-b9e4c47e0185.jpg', '

商品介绍加载中...

', 83, 83, 10000, '', 0, 0, '2019-09-18 13:18:52', 0, '2019-09-18 13:18:52'), (10027, '无印良品 MUJI 基础润肤乳液', '滋润型 400ml', 0, '/goods-img/a4a4c981-da0f-4228-bcc7-97d970dc619c.jpg', '/goods-img/a4a4c981-da0f-4228-bcc7-97d970dc619c.jpg', '

商品介绍加载中...

', 100, 100, 10000, '', 0, 0, '2019-09-18 13:18:52', 0, '2019-09-18 13:18:52'), (10028, '无印良品 MUJI 基础润肤化妆水', '高保湿型 400ml', 0, '/goods-img/98b5c5b5-cc75-4dfb-8ec4-0a7f42af6183.jpg', '/goods-img/98b5c5b5-cc75-4dfb-8ec4-0a7f42af6183.jpg', '

商品介绍加载中...

', 127, 127, 10000, '', 0, 0, '2019-09-18 13:18:52', 0, '2019-09-18 13:18:52'), (10029, '无印良品 MUJI 基础润肤化妆水', '清爽型 200ml', 0, '/goods-img/71d1f469-b77b-473a-a31a-78fc97859b3a.png', '/goods-img/71d1f469-b77b-473a-a31a-78fc97859b3a.png', '

商品介绍加载中...

', 70, 70, 10000, '', 0, 0, '2019-09-18 13:18:52', 0, '2019-09-18 13:18:52'), (10030, '无印良品 MUJI 男式', '无侧缝法兰绒 睡衣 海军蓝 L', 0, '/goods-img/68bfbfd9-bc28-429a-ab2c-7fa62205ed7e.jpg', '/goods-img/68bfbfd9-bc28-429a-ab2c-7fa62205ed7e.jpg', '

商品介绍加载中...

', 398, 199, 10000, '', 0, 0, '2019-09-18 13:18:52', 0, '2019-09-18 13:18:52'), (10031, '无印良品 MUJI 基础润肤洁面泡沫', '200ml', 0, '/goods-img/679eb5a8-7689-4620-b072-63daeb8eb73a.jpg', '/goods-img/679eb5a8-7689-4620-b072-63daeb8eb73a.jpg', '

商品介绍加载中...

', 83, 83, 10000, '', 0, 0, '2019-09-18 13:18:52', 0, '2019-09-18 13:18:52'), (10032, '无印良品 MUJI 平衡高保湿化妆水', '新蜂精选', 0, '/goods-img/eb13afc6-8898-4a50-9f93-06dd2593c313.jpg', '/goods-img/eb13afc6-8898-4a50-9f93-06dd2593c313.jpg', '

商品介绍加载中...

', 130, 65, 10000, '', 0, 0, '2019-09-18 13:18:52', 0, '2019-09-18 13:18:52'), (10033, '无印良品 MUJI 凝胶墨水圆珠笔', '蓝黑色', 0, '/goods-img/85a893fe-c971-4f0b-aa0f-4c24b65b1c75.jpg', '/goods-img/85a893fe-c971-4f0b-aa0f-4c24b65b1c75.jpg', '

商品介绍加载中...

', 8, 5, 10000, '', 0, 0, '2019-09-18 13:18:52', 0, '2019-09-18 13:18:52'), (10034, '无印良品 MUJI 平衡保湿乳霜', '50g', 0, '/goods-img/65aed381-cde0-44ed-b345-5ebf1d74a13b.jpg', '/goods-img/65aed381-cde0-44ed-b345-5ebf1d74a13b.jpg', '

商品介绍加载中...

', 130, 65, 10000, '', 0, 0, '2019-09-18 13:18:52', 0, '2019-09-18 13:18:52'), (10035, '无印良品 MUJI 基础润肤乳液', '清爽型 200ml', 0, '/goods-img/1e09e1ed-435b-4f08-84d0-d88308a315ee.png', '/goods-img/1e09e1ed-435b-4f08-84d0-d88308a315ee.png', '

商品介绍加载中...

', 70, 70, 10000, '', 0, 0, '2019-09-18 13:18:52', 0, '2019-09-18 13:18:52'), (10036, '无印良品 MUJI 平衡洁面泡沫', '100g', 0, '/goods-img/dbc2ea2a-ee03-4366-a35e-6ebe66d02399.jpg', '/goods-img/dbc2ea2a-ee03-4366-a35e-6ebe66d02399.jpg', '

商品介绍加载中...

', 85, 42, 10000, '', 0, 0, '2019-09-18 13:18:52', 0, '2019-09-18 13:18:52'), (10037, '无印良品 MUJI 基础润肤乳液', '滋润型 200ml', 0, '/goods-img/9389914c-2860-4a75-b603-53ed5a4e0509.jpg', '/goods-img/9389914c-2860-4a75-b603-53ed5a4e0509.jpg', '

商品介绍加载中...

', 61, 61, 10000, '', 0, 0, '2019-09-18 13:18:52', 0, '2019-09-18 13:18:52'), (10038, '无印良品 MUJI 便携式香薰机', '新蜂精选', 0, '/goods-img/6ab010e2-5f1e-4512-bd22-4c2550915d4c.jpg', '/goods-img/6ab010e2-5f1e-4512-bd22-4c2550915d4c.jpg', '

商品介绍加载中...

', 200, 200, 10000, '', 0, 0, '2019-09-18 13:18:52', 0, '2019-09-18 13:18:52'), (10039, '无印良品 MUJI 女式', '粗棉线条纹长袖T恤 白色*横条 L', 0, '/goods-img/fab00903-7ff6-40ee-a9bc-3fbc2f0f0ffc.jpg', '/goods-img/fab00903-7ff6-40ee-a9bc-3fbc2f0f0ffc.jpg', '

商品介绍加载中...

', 198, 70, 10000, '', 0, 0, '2019-09-18 13:18:52', 0, '2019-09-18 13:18:52'), (10040, '无印良品(MUJI) 聚丙烯化妆盒 1/2', '半透明约150x220x86mm', 0, '/goods-img/ab725751-adb8-452a-86dd-cb3d21da794e.jpg', '/goods-img/ab725751-adb8-452a-86dd-cb3d21da794e.jpg', '

商品介绍加载中...

', 30, 30, 10000, '', 0, 0, '2019-09-18 13:18:52', 0, '2019-09-18 13:18:52'), (10041, '无印良品 MUJI 聚丙烯', '笔盒 大/约184*64*25㎜', 0, '/goods-img/9f623290-928c-498f-89e6-171372b394f2.jpg', '/goods-img/9f623290-928c-498f-89e6-171372b394f2.jpg', '

商品介绍加载中...

', 18, 18, 10000, '', 0, 0, '2019-09-18 13:18:52', 0, '2019-09-18 13:18:52'), (10042, '无印良品(MUJI) 无针订书机 其他', '新蜂精选', 0, '/goods-img/a7221688-3c37-4ac0-b07e-d8bde1525d1e.jpg', '/goods-img/a7221688-3c37-4ac0-b07e-d8bde1525d1e.jpg', '

商品介绍加载中...

', 52, 52, 10000, '', 0, 0, '2019-09-18 13:18:52', 0, '2019-09-18 13:18:52'), (10043, '无印良品 MUJI 塑料橡皮', '黑色 小', 0, '/goods-img/75e26af4-8f15-43f2-9407-50d641f82acb.jpg', '/goods-img/75e26af4-8f15-43f2-9407-50d641f82acb.jpg', '

商品介绍加载中...

', 4, 4, 10000, '', 0, 0, '2019-09-18 13:18:52', 0, '2019-09-18 13:18:52'), (10044, '无印良品 MUJI 大容量基础乳液/高保湿型', '400ml', 0, '/goods-img/69d55773-1b43-497b-af18-90f2cec7c93a.jpg', '/goods-img/69d55773-1b43-497b-af18-90f2cec7c93a.jpg', '

商品介绍加载中...

', 140, 140, 10000, '', 0, 0, '2019-09-18 13:18:52', 0, '2019-09-18 13:18:52'), (10045, '无印良品 MUJI 毛笔', '黑色', 0, '/goods-img/419ddb3c-1793-49c1-8953-77409a5d5bce.jpg', '/goods-img/419ddb3c-1793-49c1-8953-77409a5d5bce.jpg', '

商品介绍加载中...

', 20, 20, 10000, '', 0, 0, '2019-09-18 13:19:02', 0, '2019-09-18 13:19:02'), (10046, '无印良品 MUJI 塑料橡皮', '白色 小', 0, '/goods-img/e53cc7af-f81c-4752-aec8-007e807b2fc1.jpg', '/goods-img/e53cc7af-f81c-4752-aec8-007e807b2fc1.jpg', '

商品介绍加载中...

', 4, 4, 10000, '', 0, 0, '2019-09-18 13:19:02', 0, '2019-09-18 13:19:02'), (10047, '无印良品 MUJI 男式', '无侧缝法兰绒 睡衣 深海军蓝X格子 L', 0, '/goods-img/481e8994-20cb-4f6c-8b77-4eb8509eb3b9.jpg', '/goods-img/481e8994-20cb-4f6c-8b77-4eb8509eb3b9.jpg', '

商品介绍加载中...

', 398, 199, 10000, '', 0, 0, '2019-09-18 13:19:02', 0, '2019-09-18 13:19:02'), (10048, '无印良品 MUJI 荧光笔', '蓝色', 0, '/goods-img/012ebf2d-8c96-4641-8782-eab01c85d98f.jpg', '/goods-img/012ebf2d-8c96-4641-8782-eab01c85d98f.jpg', '

商品介绍加载中...

', 10, 10, 10000, '', 0, 0, '2019-09-18 13:19:02', 0, '2019-09-18 13:19:02'), (10049, '无印良品(MUJI) 钢制指甲刀 小', '新蜂精选', 0, '/goods-img/2c150720-4b3a-4d9e-9ce6-77eb4998e1f1.jpg', '/goods-img/2c150720-4b3a-4d9e-9ce6-77eb4998e1f1.jpg', '

商品介绍加载中...

', 42, 42, 10000, '', 0, 0, '2019-09-18 13:19:02', 0, '2019-09-18 13:19:02'), (10050, '无印良品 MUJI 长条诗笺型笔记表格', '白色 40枚 14行', 0, '/goods-img/e7d2ea3f-6703-4fcc-bbb4-ad9ef43a0ae2.jpg', '/goods-img/e7d2ea3f-6703-4fcc-bbb4-ad9ef43a0ae2.jpg', '

商品介绍加载中...

', 10, 10, 10000, '', 0, 0, '2019-09-18 13:19:02', 0, '2019-09-18 13:19:02'), (10051, '无印良品 MUJI PET喷雾小分装瓶100ml', '新蜂精选', 0, '/goods-img/0ec8c4a7-aedc-464d-9e23-d3e4acafdc73.jpg', '/goods-img/0ec8c4a7-aedc-464d-9e23-d3e4acafdc73.jpg', '

商品介绍加载中...

', 30, 30, 10000, '', 0, 0, '2019-09-18 13:19:02', 0, '2019-09-18 13:19:02'), (10052, '无印良品 MUJI 塑料橡皮', '黑色 大', 0, '/goods-img/ce8ff43c-e8b4-4c52-9de1-c983c97068f6.jpg', '/goods-img/ce8ff43c-e8b4-4c52-9de1-c983c97068f6.jpg', '

商品介绍加载中...

', 7, 7, 10000, '', 0, 0, '2019-09-18 13:19:02', 0, '2019-09-18 13:19:02'), (10053, '无印良品 MUJI 荧光笔', '黄色', 0, '/goods-img/79b38a89-b02a-4fd1-80c4-5cb426028536.jpg', '/goods-img/79b38a89-b02a-4fd1-80c4-5cb426028536.jpg', '

商品介绍加载中...

', 10, 10, 10000, '', 0, 0, '2019-09-18 13:19:02', 0, '2019-09-18 13:19:02'), (10054, '无印良品 MUJI 遮瑕膏', '棒状 自然色', 0, '/goods-img/ffa69c8e-f57f-4ef4-a2a0-3695d538d6c5.jpg', '/goods-img/ffa69c8e-f57f-4ef4-a2a0-3695d538d6c5.jpg', '

商品介绍加载中...

', 42, 42, 10000, '', 0, 0, '2019-09-18 13:19:02', 0, '2019-09-18 13:19:02'), (10055, '无印良品 MUJI 马桶刷/附盒子', '白色', 0, '/goods-img/9dd1cdfb-e7f9-4d3c-98df-933e2bc3f9a8.jpg', '/goods-img/9dd1cdfb-e7f9-4d3c-98df-933e2bc3f9a8.jpg', '

商品介绍加载中...

', 70, 70, 10000, '', 0, 0, '2019-09-18 13:19:02', 0, '2019-09-18 13:19:02'), (10056, '无印良品 MUJI 耐热玻璃_壶_大', '透明', 0, '/goods-img/0bc4f5ac-d601-421d-8131-81958a195705.jpg', '/goods-img/0bc4f5ac-d601-421d-8131-81958a195705.jpg', '

商品介绍加载中...

', 150, 150, 10000, '', 0, 0, '2019-09-18 13:19:02', 0, '2019-09-18 13:19:02'), (10057, '无印良品 MUJI 女式', '平纹短袖衬衫 藏青色 M', 0, '/goods-img/76b6a573-12a0-4c63-b2ae-e7193aff0fc8.jpg', '/goods-img/76b6a573-12a0-4c63-b2ae-e7193aff0fc8.jpg', '

商品介绍加载中...

', 198, 59, 10000, '', 0, 0, '2019-09-18 13:19:02', 0, '2019-09-18 13:19:02'), (10058, '无印良品 MUJI 基础润肤化妆水', '清爽型 50ml', 0, '/goods-img/af7f9b21-d782-4bad-8b1a-d86bbc4d224e.png', '/goods-img/af7f9b21-d782-4bad-8b1a-d86bbc4d224e.png', '

商品介绍加载中...

', 28, 22, 10000, '', 0, 0, '2019-09-18 13:19:02', 0, '2019-09-18 13:19:02'), (10059, '无印良品 MUJI 男式', '无侧缝法兰绒 睡衣 炭灰色 M', 0, '/goods-img/26e0c424-f22d-4d3d-9bd6-a7958a346ff9.jpg', '/goods-img/26e0c424-f22d-4d3d-9bd6-a7958a346ff9.jpg', '

商品介绍加载中...

', 398, 199, 10000, '', 0, 0, '2019-09-18 13:19:02', 0, '2019-09-18 13:19:02'), (10060, '无印良品(MUJI) PET分裝瓶', '新蜂精选', 0, '/goods-img/24bf1630-0339-4c22-ad19-37152c561e71.jpg', '/goods-img/24bf1630-0339-4c22-ad19-37152c561e71.jpg', '

商品介绍加载中...

', 15, 15, 10000, '', 0, 0, '2019-09-18 13:19:02', 0, '2019-09-18 13:19:02'), (10061, '无印良品 MUJI 女式', '无侧缝法兰绒 睡衣 灰色 M', 0, '/goods-img/e8e26306-0521-4843-9e07-70ebd2fa6405.jpg', '/goods-img/e8e26306-0521-4843-9e07-70ebd2fa6405.jpg', '

商品介绍加载中...

', 398, 199, 10000, '', 0, 0, '2019-09-18 13:19:02', 0, '2019-09-18 13:19:02'), (10062, '无印良品(MUJI) PE分裝瓶', '新蜂精选', 0, '/goods-img/9b3af7c2-57f5-48a7-bea5-603b2d145000.jpg', '/goods-img/9b3af7c2-57f5-48a7-bea5-603b2d145000.jpg', '

商品介绍加载中...

', 10, 10, 10000, '', 0, 0, '2019-09-18 13:19:02', 0, '2019-09-18 13:19:02'), (10063, '无印良品 MUJI 基础润肤化妆水', '滋润型 200ml', 0, '/goods-img/7577f3e0-f48b-47a9-96b7-de405a6aaf95.png', '/goods-img/7577f3e0-f48b-47a9-96b7-de405a6aaf95.png', '

商品介绍加载中...

', 70, 70, 10000, '', 0, 0, '2019-09-18 13:19:02', 0, '2019-09-18 13:19:02'), (10064, '无印良品 MUJI 男式', '干爽 凉感珠地网眼编织V领短袖T恤 黑色 L', 0, '/goods-img/cce2af31-07ea-4744-8d01-16dd01d68e5b.jpg', '/goods-img/cce2af31-07ea-4744-8d01-16dd01d68e5b.jpg', '

商品介绍加载中...

', 98, 29, 10000, '', 0, 0, '2019-09-18 13:19:02', 0, '2019-09-18 13:19:02'), (10065, '无印良品(MUJI) 聚丙烯化妆盒 半透明约150x220x169mm', '新蜂精选', 0, '/goods-img/6dc279ac-fef0-401c-8604-b18dc9a9f7ab.jpg', '/goods-img/6dc279ac-fef0-401c-8604-b18dc9a9f7ab.jpg', '

商品介绍加载中...

', 40, 40, 10000, '', 0, 0, '2019-09-18 13:19:02', 0, '2019-09-18 13:19:02'), (10066, '无印良品(MUJI) 散粉小 自然色', '新蜂精选', 0, '/goods-img/94764fac-f4ad-4ee8-8d26-21af0c09ea76.jpg', '/goods-img/94764fac-f4ad-4ee8-8d26-21af0c09ea76.jpg', '

商品介绍加载中...

', 60, 60, 10000, '', 0, 0, '2019-09-18 13:19:02', 0, '2019-09-18 13:19:02'), (10067, '无印良品 MUJI 毛笔', '黑色', 0, '/goods-img/9cd07460-8c0b-49e5-9741-5015a3576e8e.jpg', '/goods-img/9cd07460-8c0b-49e5-9741-5015a3576e8e.jpg', '

商品介绍加载中...

', 20, 20, 10000, '', 0, 0, '2019-09-18 13:19:07', 0, '2019-09-18 13:19:07'), (10068, '无印良品 MUJI 塑料橡皮', '白色 小', 0, '/goods-img/70529ced-527a-4b46-aafa-874107ff9ea5.jpg', '/goods-img/70529ced-527a-4b46-aafa-874107ff9ea5.jpg', '

商品介绍加载中...

', 4, 4, 10000, '', 0, 0, '2019-09-18 13:19:07', 0, '2019-09-18 13:19:07'), (10069, '无印良品 MUJI 男式', '无侧缝法兰绒 睡衣 深海军蓝X格子 L', 0, '/goods-img/174ec60d-7d2b-4043-a7a6-7383c3de1a11.jpg', '/goods-img/174ec60d-7d2b-4043-a7a6-7383c3de1a11.jpg', '

商品介绍加载中...

', 398, 199, 10000, '', 0, 0, '2019-09-18 13:19:07', 0, '2019-09-18 13:19:07'), (10070, '无印良品 MUJI 荧光笔', '蓝色', 0, '/goods-img/eef29d44-17f5-41dd-b0ba-c6f63d7bdac3.jpg', '/goods-img/eef29d44-17f5-41dd-b0ba-c6f63d7bdac3.jpg', '

商品介绍加载中...

', 10, 10, 10000, '', 0, 0, '2019-09-18 13:19:07', 0, '2019-09-18 13:19:07'), (10071, '无印良品(MUJI) 钢制指甲刀 小', '新蜂精选', 0, '/goods-img/f9964432-a9b7-45c2-ac6d-680130c2d7a7.jpg', '/goods-img/f9964432-a9b7-45c2-ac6d-680130c2d7a7.jpg', '

商品介绍加载中...

', 42, 42, 10000, '', 0, 0, '2019-09-18 13:19:07', 0, '2019-09-18 13:19:07'), (10072, '无印良品 MUJI 长条诗笺型笔记表格', '白色 40枚 14行', 0, '/goods-img/da1e4523-adb4-48e4-afa5-313346187690.jpg', '/goods-img/da1e4523-adb4-48e4-afa5-313346187690.jpg', '

商品介绍加载中...

', 10, 10, 10000, '', 0, 0, '2019-09-18 13:19:07', 0, '2019-09-18 13:19:07'), (10073, '无印良品 MUJI PET喷雾小分装瓶100ml', '新蜂精选', 0, '/goods-img/7f1eec3d-d8e5-4a18-a1a9-b81876dcaaf5.jpg', '/goods-img/7f1eec3d-d8e5-4a18-a1a9-b81876dcaaf5.jpg', '

商品介绍加载中...

', 30, 30, 10000, '', 0, 0, '2019-09-18 13:19:07', 0, '2019-09-18 13:19:07'), (10074, '无印良品 MUJI 塑料橡皮', '黑色 大', 0, '/goods-img/1ca16211-2b80-4006-ab60-e1a3cab4218c.jpg', '/goods-img/1ca16211-2b80-4006-ab60-e1a3cab4218c.jpg', '

商品介绍加载中...

', 7, 7, 10000, '', 0, 0, '2019-09-18 13:19:07', 0, '2019-09-18 13:19:07'), (10075, '无印良品 MUJI 荧光笔', '黄色', 0, '/goods-img/56eec806-2af3-4136-a9bf-2333455339e7.jpg', '/goods-img/56eec806-2af3-4136-a9bf-2333455339e7.jpg', '

商品介绍加载中...

', 10, 10, 10000, '', 0, 0, '2019-09-18 13:19:07', 0, '2019-09-18 13:19:07'), (10076, '无印良品 MUJI 遮瑕膏', '棒状 自然色', 0, '/goods-img/593b65a7-feae-45aa-837e-47d58bb27474.jpg', '/goods-img/593b65a7-feae-45aa-837e-47d58bb27474.jpg', '

商品介绍加载中...

', 42, 42, 10000, '', 0, 0, '2019-09-18 13:19:07', 0, '2019-09-18 13:19:07'), (10077, '无印良品 MUJI 马桶刷/附盒子', '白色', 0, '/goods-img/a9983f71-d818-459d-ad59-bbdd26bb533b.jpg', '/goods-img/a9983f71-d818-459d-ad59-bbdd26bb533b.jpg', '

商品介绍加载中...

', 70, 70, 10000, '', 0, 0, '2019-09-18 13:19:07', 0, '2019-09-18 13:19:07'), (10078, '无印良品 MUJI 耐热玻璃_壶_大', '透明', 0, '/goods-img/7f89c29e-d888-4ee0-92af-ca713a7871a4.jpg', '/goods-img/7f89c29e-d888-4ee0-92af-ca713a7871a4.jpg', '

商品介绍加载中...

', 150, 150, 10000, '', 0, 0, '2019-09-18 13:19:07', 0, '2019-09-18 13:19:07'), (10079, '无印良品 MUJI 女式', '平纹短袖衬衫 藏青色 M', 0, '/goods-img/0b1e57bf-b4fd-40df-9832-4749d7d69db9.jpg', '/goods-img/0b1e57bf-b4fd-40df-9832-4749d7d69db9.jpg', '

商品介绍加载中...

', 198, 59, 10000, '', 0, 0, '2019-09-18 13:19:07', 0, '2019-09-18 13:19:07'), (10080, '无印良品 MUJI 基础润肤化妆水', '清爽型 50ml', 0, '/goods-img/9b4af7cf-235a-4742-bdc3-9e8e656f245c.png', '/goods-img/9b4af7cf-235a-4742-bdc3-9e8e656f245c.png', '

商品介绍加载中...

', 28, 22, 10000, '', 0, 0, '2019-09-18 13:19:07', 0, '2019-09-18 13:19:07'), (10081, '无印良品 MUJI 男式', '无侧缝法兰绒 睡衣 炭灰色 M', 0, '/goods-img/8ddfc2de-3da3-4fad-86aa-7c570cb55212.jpg', '/goods-img/8ddfc2de-3da3-4fad-86aa-7c570cb55212.jpg', '

商品介绍加载中...

', 398, 199, 10000, '', 0, 0, '2019-09-18 13:19:07', 0, '2019-09-18 13:19:07'), (10082, '无印良品(MUJI) PET分裝瓶', '新蜂精选', 0, '/goods-img/e62d04e9-3ae2-431c-8538-becda89e0e84.jpg', '/goods-img/e62d04e9-3ae2-431c-8538-becda89e0e84.jpg', '

商品介绍加载中...

', 15, 15, 10000, '', 0, 0, '2019-09-18 13:19:07', 0, '2019-09-18 13:19:07'), (10083, '无印良品 MUJI 女式', '无侧缝法兰绒 睡衣 灰色 M', 0, '/goods-img/3078143f-1cdd-4f66-951b-2cf08af8c826.jpg', '/goods-img/3078143f-1cdd-4f66-951b-2cf08af8c826.jpg', '

商品介绍加载中...

', 398, 199, 10000, '', 0, 0, '2019-09-18 13:19:07', 0, '2019-09-18 13:19:07'), (10084, '无印良品(MUJI) PE分裝瓶', '新蜂精选', 0, '/goods-img/97aa8872-26df-473a-b0d7-f5021776cb52.jpg', '/goods-img/97aa8872-26df-473a-b0d7-f5021776cb52.jpg', '

商品介绍加载中...

', 10, 10, 10000, '', 0, 0, '2019-09-18 13:19:07', 0, '2019-09-18 13:19:07'), (10085, '无印良品 MUJI 基础润肤化妆水', '滋润型 200ml', 0, '/goods-img/954da201-0cbb-45d1-9cd1-17ce4d24cfb4.png', '/goods-img/954da201-0cbb-45d1-9cd1-17ce4d24cfb4.png', '

商品介绍加载中...

', 70, 70, 10000, '', 0, 0, '2019-09-18 13:19:07', 0, '2019-09-18 13:19:07'), (10086, '无印良品 MUJI 男式', '干爽 凉感珠地网眼编织V领短袖T恤 黑色 L', 0, '/goods-img/b584ea09-7aae-422e-8435-fdc38c948434.jpg', '/goods-img/b584ea09-7aae-422e-8435-fdc38c948434.jpg', '

商品介绍加载中...

', 98, 29, 10000, '', 0, 0, '2019-09-18 13:19:07', 0, '2019-09-18 13:19:07'), (10087, '无印良品(MUJI) 聚丙烯化妆盒 半透明约150x220x169mm', '新蜂精选', 0, '/goods-img/a0a45b44-82c9-4a58-a972-304bed0632bb.jpg', '/goods-img/a0a45b44-82c9-4a58-a972-304bed0632bb.jpg', '

商品介绍加载中...

', 40, 40, 10000, '', 0, 0, '2019-09-18 13:19:07', 0, '2019-09-18 13:19:07'), (10088, '无印良品(MUJI) 散粉小 自然色', '新蜂精选', 0, '/goods-img/a1b8ff33-ec01-494e-a1db-fb5158f3c168.jpg', '/goods-img/a1b8ff33-ec01-494e-a1db-fb5158f3c168.jpg', '

商品介绍加载中...

', 60, 60, 10000, '', 0, 0, '2019-09-18 13:19:07', 0, '2019-09-18 13:19:07'), (10089, '无印良品 MUJI 荧光笔', '粉红色', 0, '/goods-img/c5d6d952-c81b-436a-a345-feb4c5a20a7d.jpg', '/goods-img/c5d6d952-c81b-436a-a345-feb4c5a20a7d.jpg', '

商品介绍加载中...

', 10, 10, 10000, '', 0, 0, '2019-09-18 13:19:17', 0, '2019-09-18 13:19:17'), (10090, '无印良品(MUJI) PET小分装瓶100ml', '新蜂精选', 0, '/goods-img/2ffe59f3-559f-4e6f-810d-1b6fa4ac04e1.jpg', '/goods-img/2ffe59f3-559f-4e6f-810d-1b6fa4ac04e1.jpg', '

商品介绍加载中...

', 30, 30, 10000, '', 0, 0, '2019-09-18 13:19:17', 0, '2019-09-18 13:19:17'), (10091, '无印良品 MUJI 基础润肤洁面乳', '150ml', 0, '/goods-img/1f24d75a-0468-471a-a608-bd6788f4c1a1.jpg', '/goods-img/1f24d75a-0468-471a-a608-bd6788f4c1a1.jpg', '

商品介绍加载中...

', 74, 74, 10000, '', 0, 0, '2019-09-18 13:19:17', 0, '2019-09-18 13:19:17'), (10092, '无印良品 MUJI 基础润肤乳霜', '其他 50g', 0, '/goods-img/86e027b3-8868-4fa5-971b-49e827027e3e.jpg', '/goods-img/86e027b3-8868-4fa5-971b-49e827027e3e.jpg', '

商品介绍加载中...

', 100, 100, 10000, '', 0, 0, '2019-09-18 13:19:17', 0, '2019-09-18 13:19:17'), (10093, '无印良品 MUJI 基础润肤洁面泡沫(替换装)', '180ml', 0, '/goods-img/1aea34fa-f45e-4c3c-b73c-da1f92492c95.jpg', '/goods-img/1aea34fa-f45e-4c3c-b73c-da1f92492c95.jpg', '

商品介绍加载中...

', 69, 69, 10000, '', 0, 0, '2019-09-18 13:19:17', 0, '2019-09-18 13:19:17'), (10094, '无印良品 MUJI 保湿洁面啫喱', '100g', 0, '/goods-img/838fc0cb-b98f-4dca-bd68-581138b21a30.jpg', '/goods-img/838fc0cb-b98f-4dca-bd68-581138b21a30.jpg', '

商品介绍加载中...

', 100, 50, 10000, '', 0, 0, '2019-09-18 13:19:17', 0, '2019-09-18 13:19:17'), (10095, '无印良品 MUJI 小型超声波香薰机', '其他', 0, '/goods-img/30f05c92-a303-4b94-bb5e-22f3c65f3c37.jpg', '/goods-img/30f05c92-a303-4b94-bb5e-22f3c65f3c37.jpg', '

商品介绍加载中...

', 250, 250, 10000, '', 0, 0, '2019-09-18 13:19:17', 0, '2019-09-18 13:19:17'), (10096, '无印良品 MUJI 修正带', '其他', 0, '/goods-img/759427b3-b723-4917-b565-c0ae2003bf02.jpg', '/goods-img/759427b3-b723-4917-b565-c0ae2003bf02.jpg', '

商品介绍加载中...

', 25, 25, 10000, '', 0, 0, '2019-09-18 13:19:17', 0, '2019-09-18 13:19:17'), (10097, '无印良品 MUJI 聚丙烯', '笔盒 小/约170*51*20㎜', 0, '/goods-img/734f1604-e687-4cd1-8573-bb00e680e94e.jpg', '/goods-img/734f1604-e687-4cd1-8573-bb00e680e94e.jpg', '

商品介绍加载中...

', 12, 12, 10000, '', 0, 0, '2019-09-18 13:19:17', 0, '2019-09-18 13:19:17'), (10098, '无印良品 MUJI 乳液', '50ml', 0, '/goods-img/4eed1033-7728-477c-a29d-589bfd3ae3ce.jpg', '/goods-img/4eed1033-7728-477c-a29d-589bfd3ae3ce.jpg', '

商品介绍加载中...

', 55, 27, 10000, '', 0, 0, '2019-09-18 13:19:17', 0, '2019-09-18 13:19:17'), (10099, '无印良品 MUJI 男式', '棉水洗 平纹短袖衬衫 白色 L', 0, '/goods-img/d3fa11f3-6cfa-4958-b09c-584a62137b4b.jpg', '/goods-img/d3fa11f3-6cfa-4958-b09c-584a62137b4b.jpg', '

商品介绍加载中...

', 178, 89, 10000, '', 0, 0, '2019-09-18 13:19:17', 0, '2019-09-18 13:19:17'), (10100, '无印良品 MUJI 香/绿意', '12支装/棒状', 0, '/goods-img/829f2d09-1589-4f63-8376-d347c3cec620.jpg', '/goods-img/829f2d09-1589-4f63-8376-d347c3cec620.jpg', '

商品介绍加载中...

', 32, 32, 10000, '', 0, 0, '2019-09-18 13:19:17', 0, '2019-09-18 13:19:17'), (10101, '无印良品 MUJI 润肤乳霜(高保湿型)50g', '50g', 0, '/goods-img/1c70ddcb-ca69-40ed-a263-30880b2e2cac.jpg', '/goods-img/1c70ddcb-ca69-40ed-a263-30880b2e2cac.jpg', '

商品介绍加载中...

', 159, 159, 10000, '', 0, 0, '2019-09-18 13:19:17', 0, '2019-09-18 13:19:17'), (10102, '无印良品 MUJI 柔滑笔芯', '黑色', 0, '/goods-img/1db10d7c-3429-4ef2-ac41-2991af57f442.jpg', '/goods-img/1db10d7c-3429-4ef2-ac41-2991af57f442.jpg', '

商品介绍加载中...

', 19, 19, 10000, '', 0, 0, '2019-09-18 13:19:17', 0, '2019-09-18 13:19:17'), (10103, '无印良品 MUJI 铝制', '挂钩/吸盘式_2个装 大/约宽4.5x高6cm 2个装', 0, '/goods-img/bd0b92b4-c8ca-453a-b572-b3447083bddf.png', '/goods-img/bd0b92b4-c8ca-453a-b572-b3447083bddf.png', '

商品介绍加载中...

', 25, 25, 10000, '', 0, 0, '2019-09-18 13:19:17', 0, '2019-09-18 13:19:17'), (10104, '无印良品 MUJI 修正带', 'POM材质 替芯', 0, '/goods-img/98ce17e1-890e-4eaf-856a-7fce8ffebc4c.jpg', '/goods-img/98ce17e1-890e-4eaf-856a-7fce8ffebc4c.jpg', '

商品介绍加载中...

', 15, 15, 10000, '', 0, 0, '2019-09-18 13:19:17', 0, '2019-09-18 13:19:17'), (10105, '无印良品 MUJI 压克力记录板夹', 'A4用/220×310mm', 0, '/goods-img/64d4e0b7-cd01-47f6-9081-4c2e7625e4f9.jpg', '/goods-img/64d4e0b7-cd01-47f6-9081-4c2e7625e4f9.jpg', '

商品介绍加载中...

', 35, 35, 10000, '', 0, 0, '2019-09-18 13:19:17', 0, '2019-09-18 13:19:17'), (10106, '无印良品(MUJI) 自然亲肤粉底液 自然透亮色', '新蜂精选', 0, '/goods-img/09576fcd-ea01-4b1d-bed4-be96b71f2c4e.jpg', '/goods-img/09576fcd-ea01-4b1d-bed4-be96b71f2c4e.jpg', '

商品介绍加载中...

', 75, 75, 10000, '', 0, 0, '2019-09-18 13:19:17', 0, '2019-09-18 13:19:17'), (10107, '无印良品 MUJI 荧光笔', '粉红色', 0, '/goods-img/04a8c325-d296-4f0e-ac6d-8cccba4dc90e.jpg', '/goods-img/04a8c325-d296-4f0e-ac6d-8cccba4dc90e.jpg', '

商品介绍加载中...

', 10, 10, 10000, '', 0, 0, '2019-09-18 13:19:22', 0, '2019-09-18 13:19:22'), (10108, '无印良品(MUJI) PET小分装瓶100ml', '新蜂精选', 0, '/goods-img/755a34a3-bc3e-4f04-8943-f79860012e78.jpg', '/goods-img/755a34a3-bc3e-4f04-8943-f79860012e78.jpg', '

商品介绍加载中...

', 30, 30, 10000, '', 0, 0, '2019-09-18 13:19:22', 0, '2019-09-18 13:19:22'), (10109, '无印良品 MUJI 基础润肤洁面乳', '150ml', 0, '/goods-img/e6a986ed-9b83-4649-9e72-3cf676c1f90e.jpg', '/goods-img/e6a986ed-9b83-4649-9e72-3cf676c1f90e.jpg', '

商品介绍加载中...

', 74, 74, 10000, '', 0, 0, '2019-09-18 13:19:22', 0, '2019-09-18 13:19:22'), (10110, '无印良品 MUJI 基础润肤乳霜', '其他 50g', 0, '/goods-img/30036561-a150-4ea7-9106-29bbea278909.jpg', '/goods-img/30036561-a150-4ea7-9106-29bbea278909.jpg', '

商品介绍加载中...

', 100, 100, 10000, '', 0, 0, '2019-09-18 13:19:22', 0, '2019-09-18 13:19:22'), (10111, '无印良品 MUJI 基础润肤洁面泡沫(替换装)', '180ml', 0, '/goods-img/aa37202c-68eb-4c84-b02c-171b3d11c0e8.jpg', '/goods-img/aa37202c-68eb-4c84-b02c-171b3d11c0e8.jpg', '

商品介绍加载中...

', 69, 69, 10000, '', 0, 0, '2019-09-18 13:19:22', 0, '2019-09-18 13:19:22'), (10112, '无印良品 MUJI 保湿洁面啫喱', '100g', 0, '/goods-img/0f724c0f-8888-4b75-8fe1-dc7dd8f2b7bd.jpg', '/goods-img/0f724c0f-8888-4b75-8fe1-dc7dd8f2b7bd.jpg', '

商品介绍加载中...

', 100, 50, 10000, '', 0, 0, '2019-09-18 13:19:22', 0, '2019-09-18 13:19:22'), (10113, '无印良品 MUJI 小型超声波香薰机', '其他', 0, '/goods-img/9608b59d-cbca-4b70-9f05-226fde41c51c.jpg', '/goods-img/9608b59d-cbca-4b70-9f05-226fde41c51c.jpg', '

商品介绍加载中...

', 250, 250, 10000, '呼吸品质生活', 0, 0, '2019-09-18 13:19:22', 0, '2019-09-18 13:19:22'), (10114, '无印良品 MUJI 修正带', '其他', 0, '/goods-img/d91a71e7-aada-4770-91c5-4da21e4b7ed9.jpg', '/goods-img/d91a71e7-aada-4770-91c5-4da21e4b7ed9.jpg', '

商品介绍加载中...

', 25, 25, 10000, '', 0, 0, '2019-09-18 13:19:22', 0, '2019-09-18 13:19:22'), (10115, '无印良品 MUJI 聚丙烯', '笔盒 小/约170*51*20㎜', 0, '/goods-img/d543ba0d-18d8-427a-87ea-99968b319440.jpg', '/goods-img/d543ba0d-18d8-427a-87ea-99968b319440.jpg', '

商品介绍加载中...

', 12, 12, 10000, '', 0, 0, '2019-09-18 13:19:22', 0, '2019-09-18 13:19:22'), (10116, '无印良品 MUJI 乳液', '50ml', 0, '/goods-img/cd6d91b0-69b2-4415-8560-4cbd2690cb50.jpg', '/goods-img/cd6d91b0-69b2-4415-8560-4cbd2690cb50.jpg', '

商品介绍加载中...

', 55, 27, 10000, '', 0, 0, '2019-09-18 13:19:22', 0, '2019-09-18 13:19:22'), (10117, '无印良品 MUJI 男式', '棉水洗 平纹短袖衬衫 白色 L', 0, '/goods-img/b08c94ac-cba2-4468-b3d0-03d9447f5bf2.jpg', '/goods-img/b08c94ac-cba2-4468-b3d0-03d9447f5bf2.jpg', '

商品介绍加载中...

', 178, 89, 10000, '', 0, 0, '2019-09-18 13:19:22', 0, '2019-09-18 13:19:22'), (10118, '无印良品 MUJI 香/绿意', '12支装/棒状', 0, '/goods-img/5a65f952-4141-47f8-8f8e-84120bbf74ea.jpg', '/goods-img/5a65f952-4141-47f8-8f8e-84120bbf74ea.jpg', '

商品介绍加载中...

', 32, 32, 10000, '', 0, 0, '2019-09-18 13:19:22', 0, '2019-09-18 13:19:22'), (10119, '无印良品 MUJI 润肤乳霜(高保湿型)50g', '50g', 0, '/goods-img/503ef53e-d4ac-4c4e-83a7-8a03ead0ecc8.jpg', '/goods-img/503ef53e-d4ac-4c4e-83a7-8a03ead0ecc8.jpg', '

商品介绍加载中...

', 159, 159, 10000, '', 0, 0, '2019-09-18 13:19:22', 0, '2019-09-18 13:19:22'), (10120, '无印良品 MUJI 柔滑笔芯', '黑色', 0, '/goods-img/aa83ce5b-2db1-4ecf-bc4f-f43c437894d7.jpg', '/goods-img/aa83ce5b-2db1-4ecf-bc4f-f43c437894d7.jpg', '

商品介绍加载中...

', 19, 19, 10000, '', 0, 0, '2019-09-18 13:19:22', 0, '2019-09-18 13:19:22'), (10121, '无印良品 MUJI 铝制', '挂钩/吸盘式_2个装 大/约宽4.5x高6cm 2个装', 0, '/goods-img/5c590548-9de3-47a3-8cb9-4d8f040a9635.png', '/goods-img/5c590548-9de3-47a3-8cb9-4d8f040a9635.png', '

商品介绍加载中...

', 25, 25, 10000, '', 0, 0, '2019-09-18 13:19:22', 0, '2019-09-18 13:19:22'), (10122, '无印良品 MUJI 修正带', 'POM材质 替芯', 0, '/goods-img/93181f0b-c069-4542-be91-a63856cd12d1.jpg', '/goods-img/93181f0b-c069-4542-be91-a63856cd12d1.jpg', '

商品介绍加载中...

', 15, 15, 10000, '', 0, 0, '2019-09-18 13:19:22', 0, '2019-09-18 13:19:22'), (10123, '无印良品 MUJI 压克力记录板夹', 'A4用/220×310mm', 0, '/goods-img/45be1de3-447b-404b-9df8-ddf07fdc8647.jpg', '/goods-img/45be1de3-447b-404b-9df8-ddf07fdc8647.jpg', '

商品介绍加载中...

', 35, 35, 10000, '', 0, 0, '2019-09-18 13:19:22', 0, '2019-09-18 13:19:22'), (10124, '无印良品(MUJI) 自然亲肤粉底液 自然透亮色', '新蜂精选', 0, '/goods-img/7f905827-5765-40bc-a1b8-bedd9f407ced.jpg', '/goods-img/7f905827-5765-40bc-a1b8-bedd9f407ced.jpg', '

商品介绍加载中...

', 75, 75, 10000, '', 0, 0, '2019-09-18 13:19:22', 0, '2019-09-18 13:19:22'), (10125, '无印良品 MUJI PE小分装盒', '透明 30g', 0, '/goods-img/1d7f28bb-6597-48de-a6bb-2561697db883.jpg', '/goods-img/1d7f28bb-6597-48de-a6bb-2561697db883.jpg', '

商品介绍加载中...

', 10, 10, 10000, '', 0, 0, '2019-09-18 13:19:30', 0, '2019-09-18 13:19:30'), (10126, '无印良品 MUJI 保湿化妆液', '新蜂精选', 0, '/goods-img/53a089a9-e1d1-487e-974e-18bb4df41cf3.jpg', '/goods-img/53a089a9-e1d1-487e-974e-18bb4df41cf3.jpg', '

商品介绍加载中...

', 160, 80, 10000, '', 0, 0, '2019-09-18 13:19:30', 0, '2019-09-18 13:19:30'), (10127, '无印良品 MUJI 女式', '棉弹力 高领T恤 深灰色 M', 0, '/goods-img/53a6478b-4fd5-4add-b095-9fd4ad983a7b.jpg', '/goods-img/53a6478b-4fd5-4add-b095-9fd4ad983a7b.jpg', '

商品介绍加载中...

', 128, 40, 10000, '', 0, 0, '2019-09-18 13:19:30', 0, '2019-09-18 13:19:30'), (10128, '无印良品 MUJI 男式', '棉水洗 牛津纽扣领短袖衬衫 白色 L', 0, '/goods-img/561e9e6d-b130-468d-8328-36a5ff70cdfa.jpg', '/goods-img/561e9e6d-b130-468d-8328-36a5ff70cdfa.jpg', '

商品介绍加载中...

', 178, 89, 10000, '', 0, 0, '2019-09-18 13:19:30', 0, '2019-09-18 13:19:30'), (10129, '无印良品 MUJI 基础润肤乳液', '高保湿型 50ml', 0, '/goods-img/01514263-83b4-4ac7-aee3-5e5a2448414f.jpg', '/goods-img/01514263-83b4-4ac7-aee3-5e5a2448414f.jpg', '

商品介绍加载中...

', 37, 29, 10000, '', 0, 0, '2019-09-18 13:19:30', 0, '2019-09-18 13:19:30'), (10130, 'MUJI 羽毛 靠垫', '白色', 0, '/goods-img/23e5ee1d-5bb7-4f2a-b4b5-4fbc9ca3c163.jpg', '/goods-img/23e5ee1d-5bb7-4f2a-b4b5-4fbc9ca3c163.jpg', '

商品介绍加载中...

', 65, 65, 10000, '', 0, 0, '2019-09-18 13:19:30', 0, '2019-09-18 13:19:30'), (10131, '无印良品(MUJI) 可携带用小卷尺 白色', '新蜂精选', 0, '/goods-img/a4d3a61e-b0d3-4c58-85d6-fddf1de85f66.jpg', '/goods-img/a4d3a61e-b0d3-4c58-85d6-fddf1de85f66.jpg', '

商品介绍加载中...

', 28, 28, 10000, '', 0, 0, '2019-09-18 13:19:30', 0, '2019-09-18 13:19:30'), (10132, '无印良品 MUJI 笔记本/5mm方格', '暗灰色 B5/30张/线装', 0, '/goods-img/38c25b00-a4fb-4893-aa8e-34ff76963397.jpg', '/goods-img/38c25b00-a4fb-4893-aa8e-34ff76963397.jpg', '

商品介绍加载中...

', 9, 9, 10000, '', 0, 0, '2019-09-18 13:19:30', 0, '2019-09-18 13:19:30'), (10133, '无印良品 MUJI 低重心铅笔', '白色', 0, '/goods-img/dc497882-61ea-4d4f-98fe-d2b2500eda01.jpg', '/goods-img/dc497882-61ea-4d4f-98fe-d2b2500eda01.jpg', '

商品介绍加载中...

', 47, 47, 10000, '', 0, 0, '2019-09-18 13:19:30', 0, '2019-09-18 13:19:30'), (10134, '无印良品(MUJI) 手动碎纸机', '新蜂精选', 0, '/goods-img/f6e1ce14-a590-4736-9d36-df5628bc4188.jpg', '/goods-img/f6e1ce14-a590-4736-9d36-df5628bc4188.jpg', '

商品介绍加载中...

', 75, 75, 10000, '', 0, 0, '2019-09-18 13:19:30', 0, '2019-09-18 13:19:30'), (10135, '无印良品 MUJI 女式', '无袖衫 燕麦色 XL', 0, '/goods-img/c2e30c9b-ce49-4824-824a-b7d3ae173340.jpg', '/goods-img/c2e30c9b-ce49-4824-824a-b7d3ae173340.jpg', '

商品介绍加载中...

', 178, 53, 10000, '', 0, 0, '2019-09-18 13:19:30', 0, '2019-09-18 13:19:30'), (10136, '无印良品 MUJI 女式', '粗棉线长袖T恤 生成色 L', 0, '/goods-img/4b1b98d5-359f-4025-85e3-f357b6e9724a.jpg', '/goods-img/4b1b98d5-359f-4025-85e3-f357b6e9724a.jpg', '

商品介绍加载中...

', 198, 70, 10000, '', 0, 0, '2019-09-18 13:19:30', 0, '2019-09-18 13:19:30'), (10137, '无印良品 MUJI 塑料浴室座椅/小', '原色', 0, '/goods-img/37053615-750d-486e-b218-358a7c1adb21.jpg', '/goods-img/37053615-750d-486e-b218-358a7c1adb21.jpg', '

商品介绍加载中...

', 85, 85, 10000, '', 0, 0, '2019-09-18 13:19:30', 0, '2019-09-18 13:19:30'), (10138, '无印良品(MUJI) 树脂携带型订书机 白色', '新蜂精选', 0, '/goods-img/21dd6bd9-c4bc-4e17-8fed-23775cebf361.jpg', '/goods-img/21dd6bd9-c4bc-4e17-8fed-23775cebf361.jpg', '

商品介绍加载中...

', 42, 42, 10000, '', 0, 0, '2019-09-18 13:19:30', 0, '2019-09-18 13:19:30'), (10139, '无印良品 MUJI 基础润肤乳液', '滋润型', 0, '/goods-img/b8978340-ff72-4b5a-a9d3-4b5610982764.jpg', '/goods-img/b8978340-ff72-4b5a-a9d3-4b5610982764.jpg', '

商品介绍加载中...

', 28, 22, 10000, '', 0, 0, '2019-09-18 13:19:30', 0, '2019-09-18 13:19:30'), (10140, '无印良品(MUJI) 控色隔离霜30g 浅蓝色', '新蜂精选', 0, '/goods-img/b2969d29-b073-48f3-aa9a-b8aeb08a98d6.jpg', '/goods-img/b2969d29-b073-48f3-aa9a-b8aeb08a98d6.jpg', '

商品介绍加载中...

', 65, 65, 10000, '', 0, 0, '2019-09-18 13:19:30', 0, '2019-09-18 13:19:30'), (10141, '无印良品 MUJI 女式', '粗棉线条纹长袖T恤 黑*横条 L', 0, '/goods-img/a905c374-3411-4ddd-9b84-7ecbc9b50620.jpg', '/goods-img/a905c374-3411-4ddd-9b84-7ecbc9b50620.jpg', '

商品介绍加载中...

', 198, 70, 10000, '', 0, 0, '2019-09-18 13:19:30', 0, '2019-09-18 13:19:30'), (10142, '无印良品 MUJI PE小分装盒', '透明 30g', 0, '/goods-img/2750405a-2e01-463d-a059-54644c67f7cc.jpg', '/goods-img/2750405a-2e01-463d-a059-54644c67f7cc.jpg', '

商品介绍加载中...

', 10, 10, 10000, '', 0, 0, '2019-09-18 13:19:35', 0, '2019-09-18 13:19:35'), (10143, '无印良品 MUJI 保湿化妆液', '新蜂精选', 0, '/goods-img/17656dd7-c0fb-431d-810a-5eb29d07c011.jpg', '/goods-img/17656dd7-c0fb-431d-810a-5eb29d07c011.jpg', '

商品介绍加载中...

', 160, 80, 10000, '', 0, 0, '2019-09-18 13:19:35', 0, '2019-09-18 13:19:35'), (10144, '无印良品 MUJI 女式', '棉弹力 高领T恤 深灰色 M', 0, '/goods-img/780e716a-7be8-4d94-b8b6-833b4d97e148.jpg', '/goods-img/780e716a-7be8-4d94-b8b6-833b4d97e148.jpg', '

商品介绍加载中...

', 128, 40, 10000, '', 0, 0, '2019-09-18 13:19:35', 0, '2019-09-18 13:19:35'), (10145, '无印良品 MUJI 男式', '棉水洗 牛津纽扣领短袖衬衫 白色 L', 0, '/goods-img/94f5b471-1148-4320-aa8a-68573706fd91.jpg', '/goods-img/94f5b471-1148-4320-aa8a-68573706fd91.jpg', '

商品介绍加载中...

', 178, 89, 10000, '', 0, 0, '2019-09-18 13:19:35', 0, '2019-09-18 13:19:35'), (10146, '无印良品 MUJI 基础润肤乳液', '高保湿型 50ml', 0, '/goods-img/a12dcb9c-bb36-4df9-b517-1578a03fe062.jpg', '/goods-img/a12dcb9c-bb36-4df9-b517-1578a03fe062.jpg', '

商品介绍加载中...

', 37, 29, 10000, '', 0, 0, '2019-09-18 13:19:35', 0, '2019-09-18 13:19:35'), (10147, 'MUJI 羽毛 靠垫', '白色', 0, '/goods-img/0f701215-b782-40c7-8bbd-97b51be56461.jpg', '/goods-img/0f701215-b782-40c7-8bbd-97b51be56461.jpg', '

商品介绍加载中...

', 65, 65, 10000, '悠享惬意', 0, 0, '2019-09-18 13:19:35', 0, '2019-09-18 13:19:35'), (10148, '无印良品(MUJI) 可携带用小卷尺 白色', '新蜂精选', 0, '/goods-img/737afa41-1905-4dbc-ab33-95f8489dde5b.jpg', '/goods-img/737afa41-1905-4dbc-ab33-95f8489dde5b.jpg', '

商品介绍加载中...

', 28, 28, 10000, '', 0, 0, '2019-09-18 13:19:35', 0, '2019-09-18 13:19:35'), (10149, '无印良品 MUJI 笔记本/5mm方格', '暗灰色 B5/30张/线装', 0, '/goods-img/c6632420-ad7e-451b-a2a9-b02299653db1.jpg', '/goods-img/c6632420-ad7e-451b-a2a9-b02299653db1.jpg', '

商品介绍加载中...

', 9, 9, 10000, '', 0, 0, '2019-09-18 13:19:35', 0, '2019-09-18 13:19:35'), (10150, '无印良品 MUJI 低重心铅笔', '白色', 0, '/goods-img/060e3ace-71ca-44a2-9ded-73a05f186fcf.jpg', '/goods-img/060e3ace-71ca-44a2-9ded-73a05f186fcf.jpg', '

商品介绍加载中...

', 47, 47, 10000, '', 0, 0, '2019-09-18 13:19:35', 0, '2019-09-18 13:19:35'), (10151, '无印良品(MUJI) 手动碎纸机', '新蜂精选', 0, '/goods-img/58d831e4-07f4-44e2-a994-1a7d585452a1.jpg', '/goods-img/58d831e4-07f4-44e2-a994-1a7d585452a1.jpg', '

商品介绍加载中...

', 75, 75, 10000, '', 0, 0, '2019-09-18 13:19:35', 0, '2019-09-18 13:19:35'), (10152, '无印良品 MUJI 女式', '无袖衫 燕麦色 XL', 0, '/goods-img/f2aaadc0-ddda-4736-9826-2dbb2c533ea0.jpg', '/goods-img/f2aaadc0-ddda-4736-9826-2dbb2c533ea0.jpg', '

商品介绍加载中...

', 178, 53, 10000, '', 0, 0, '2019-09-18 13:19:35', 0, '2019-09-18 13:19:35'), (10153, '无印良品 MUJI 女式', '粗棉线长袖T恤 生成色 L', 0, '/goods-img/09c87218-d645-48e7-bbd5-54af5e77bf4b.jpg', '/goods-img/09c87218-d645-48e7-bbd5-54af5e77bf4b.jpg', '

商品介绍加载中...

', 198, 70, 10000, '', 0, 0, '2019-09-18 13:19:35', 0, '2019-09-18 13:19:35'), (10154, '无印良品 MUJI 塑料浴室座椅', '原色', 0, '/goods-img/15395057-94e9-4545-a8ee-8aee025f40c5.jpg', '/goods-img/15395057-94e9-4545-a8ee-8aee025f40c5.jpg', '

商品介绍加载中...

', 85, 85, 10000, '无印良品', 0, 0, '2019-09-18 13:19:35', 0, '2019-09-18 13:19:35'), (10155, '无印良品(MUJI) 树脂携带型订书机 白色', '新蜂精选', 0, '/goods-img/3b40971a-3f32-45cf-a99a-aada90ee8e33.jpg', '/goods-img/3b40971a-3f32-45cf-a99a-aada90ee8e33.jpg', '

商品介绍加载中...

', 42, 42, 10000, '', 0, 0, '2019-09-18 13:19:35', 0, '2019-09-18 13:19:35'), (10156, '无印良品 MUJI 基础润肤乳液', '滋润型', 0, '/goods-img/f65ef709-8fa8-4a3f-8abd-75a9b0492b14.jpg', '/goods-img/f65ef709-8fa8-4a3f-8abd-75a9b0492b14.jpg', '

商品介绍加载中...

', 28, 22, 10000, '', 0, 0, '2019-09-18 13:19:35', 0, '2019-09-18 13:19:35'), (10157, '无印良品(MUJI) 控色隔离霜30g 浅蓝色', '新蜂精选', 0, '/goods-img/66311489-b28b-41c3-ac34-540293df6e42.jpg', '/goods-img/66311489-b28b-41c3-ac34-540293df6e42.jpg', '

商品介绍加载中...

', 65, 65, 10000, '', 0, 0, '2019-09-18 13:19:35', 0, '2019-09-18 13:19:35'), (10158, '无印良品 女式粗棉线条纹长袖T恤', '黑*横条 L', 20, '/goods-img/5488564b-8335-4b0c-a5a4-52f3f03ee728.jpg', '/goods-img/5488564b-8335-4b0c-a5a4-52f3f03ee728.jpg', '

商品介绍加载中...

', 198, 70, 10000, '无印良品', 0, 0, '2019-09-18 13:19:35', 0, '2019-09-18 17:50:19'), (10159, 'Apple AirPods 配充电盒', '苹果蓝牙耳机', 0, '/goods-img/53c9f268-7cd4-4fac-909c-2dc066625655.jpg', '/goods-img/53c9f268-7cd4-4fac-909c-2dc066625655.jpg', '详情加载中...', 1246, 1246, 10000, '', 0, 0, '2019-09-18 13:21:28', 0, '2019-09-18 13:21:28'), (10160, '小米 Redmi AirDots', '真无线蓝牙耳机|分体式耳机 |收纳充电盒 |蓝牙5.0 |按键防触控操作', 51, '/goods-img/c47403f1-b706-453b-88d8-2bfdee0316be.jpg', '/goods-img/c47403f1-b706-453b-88d8-2bfdee0316be.jpg', '详情加载中...', 129, 129, 10000, '为自由发声', 0, 0, '2019-09-18 13:21:28', 0, '2019-09-18 13:21:28'), (10161, '荣耀原装三键线控带麦半入耳式耳机AM116(尊爵版)适用于华为荣耀手机', '新蜂精选', 0, '/goods-img/183481c3-47ff-4b2e-926f-b02b926ac02c.jpg', '/goods-img/183481c3-47ff-4b2e-926f-b02b926ac02c.jpg', '

商品介绍加载中...

', 69, 49, 10000, '', 0, 0, '2019-09-18 13:21:28', 0, '2019-09-18 13:21:28'), (10162, '诺基亚(NOKIA)BH-705 银白色 5.0真无线蓝牙耳机迷你运动跑步音乐商务入耳式安卓苹果手机蓝牙耳机', '新蜂精选', 0, '/goods-img/5e0d089b-fa91-410d-8ff2-9534eb6f627f.jpg', '/goods-img/5e0d089b-fa91-410d-8ff2-9534eb6f627f.jpg', '详情加载中...', 499, 499, 10000, '', 0, 0, '2019-09-18 13:21:28', 0, '2019-09-18 13:21:28'), (10163, '华为耳机原装半入耳式有线mate9p10plus8x荣耀v20v10nova2s9iv9p9play 【标准版】华为AM115 白色-热卖款', '新蜂精选', 0, '/goods-img/79e2b467-a075-46ef-ab43-aa0535f8e4c9.jpg', '/goods-img/79e2b467-a075-46ef-ab43-aa0535f8e4c9.jpg', '

商品介绍加载中...

', 69, 39, 10000, '', 0, 0, '2019-09-18 13:21:28', 0, '2019-09-18 13:21:28'), (10164, 'Beats X 蓝牙无线', '入耳式耳机 带麦可通话 -桀骜黑红(十周年版) MRQA2PA/A', 0, '/goods-img/911531a4-39a6-4771-b26e-2ba4db1ebcda.jpg', '/goods-img/911531a4-39a6-4771-b26e-2ba4db1ebcda.jpg', '

商品介绍加载中...

', 1168, 799, 10000, '', 0, 0, '2019-09-18 13:21:28', 0, '2019-09-18 13:21:28'), (10165, '华为( HUAWEI) 华为无线耳机', '真无线蓝牙耳机 双耳蓝牙音乐耳机 Freebuds 2 无线耳机 陶瓷白', 0, '/goods-img/e70a4f29-2269-466a-984e-01e018206c2e.jpg', '/goods-img/e70a4f29-2269-466a-984e-01e018206c2e.jpg', '详情加载中...', 899, 799, 10000, '', 0, 0, '2019-09-18 13:21:28', 0, '2019-09-18 13:21:28'), (10166, '【自营仓次日达】moloke真无线蓝牙耳机双耳适用于苹果华为小米 运动跑步入耳式oppo迷你商务耳机 【1:1尊享版】自动弹窗+无线充电+可触控(热卖)', '新蜂精选', 51, '/goods-img/70dc1586-13bd-4b4c-92a9-fe20aa1d531f.jpg', '/goods-img/70dc1586-13bd-4b4c-92a9-fe20aa1d531f.jpg', '

商品介绍加载中...

', 359, 199, 10000, '', 0, 0, '2019-09-18 13:21:28', 0, '2019-09-18 13:21:28'), (10167, 'Beats Powerbeats Pro', '完全无线高性能耳机 真无线蓝牙运动耳机 象牙白', 0, '/goods-img/04441cd4-81c8-4ad9-a067-9d15422e508f.jpg', '/goods-img/04441cd4-81c8-4ad9-a067-9d15422e508f.jpg', '详情加载中...', 1888, 1888, 10000, '', 0, 0, '2019-09-18 13:21:28', 0, '2019-09-18 13:21:28'), (10168, '纽曼(Newmine)NM-LK06 全兼容线控音乐手机耳机 白色', '新蜂精选', 0, '/goods-img/ad53ea23-6974-4e44-b62d-eab498ce1d63.jpg', '/goods-img/ad53ea23-6974-4e44-b62d-eab498ce1d63.jpg', '

商品介绍加载中...

', 9, 9, 10000, '', 0, 0, '2019-09-18 13:21:28', 0, '2019-09-18 13:21:28'), (10169, '索尼(SONY)重低音立体声耳机MDR-XB55AP 黑色', '新蜂精选', 0, '/goods-img/01e1998d-f183-4e99-b8ba-7715727cf90b.jpg', '/goods-img/01e1998d-f183-4e99-b8ba-7715727cf90b.jpg', '*黑色实物偏灰,请以实物为准 Bass Booster低音增强器技术可呈现紧实深邃低频。 12 毫米驱动单元和110dB/mW 的高灵敏度,呈现高质感音效。 人体工学设计的倾斜入耳方式,让耳塞能够深入耳朵内部,呈现出色的隔音效果,同时带来舒适的佩戴感和高音质的享受。 耳塞能够深入耳朵内部,呈现出色的隔音效果,同时为您带来舒适的佩戴感和高音质的享受。 采用混合两种硬度硅胶的耳塞套: 核心部分使用硬质材料保持音质,减少因耳塞变形导致的声音失真; 外围部分柔软材料提高了耳塞密闭性,让您能长时间舒适佩戴。 *线控的可用性及操作因智能手机而异 耳机线表面细小沟壑,减少容易引起缠绕的摩擦,使导线不容易纠结在一起,方便欣赏音乐和携带。 防缠绕耳机线 盲点设计 便携袋 防尘滤网 导线滑块 4种尺寸耳塞套 摘下耳机的耳塞套,可见保护单元的网罩,用来防止异物和灰尘堵塞单元,使耳机经久耐听。 在左耳外壳和耳机线的连接处设有浮点,凭手指触摸就能判别左右耳,方便操作。 随机附赠收纳袋一只,保护你心爱的耳机。 利用导线滑块来调整左右耳机线的长度,也能够减少收纳耳机时容易出现的缠线现象 提供4对不同尺寸(SS、S、M、L)的耳塞套(M号出厂时已安装至耳机上),根据你的耳洞大小自由更换,获得良好的隔音效果,佩戴舒适。 ● 立体声耳机 ● 混合硅胶耳塞(SS/S/M/L 每种尺寸2个) *M号出厂时安装至本耳机。 ● 便携袋(×1) *EXTRA BASS 和 EXTRABASS 是索尼公司的商标', 229, 185, 10000, '', 0, 0, '2019-09-18 13:21:28', 0, '2019-09-18 13:21:28'), (10170, '索尼(SONY)WI-1000X Hi-Res颈挂式 入耳式', '无线蓝牙耳机 高音质降噪耳机 手机通话 黑色', 0, '/goods-img/1631a30b-287c-41da-bbbe-1a9b1b8d1552.jpg', '/goods-img/1631a30b-287c-41da-bbbe-1a9b1b8d1552.jpg', '详情加载中...', 2399, 1499, 10000, '', 0, 0, '2019-09-18 13:21:28', 0, '2019-09-18 13:21:28'), (10171, '小米耳机 圈铁Pro 入耳式有线运动音乐耳机耳麦', '新蜂精选', 51, '/goods-img/f3d269a4-5317-4b30-b164-1311f6c1f058.jpg', '/goods-img/f3d269a4-5317-4b30-b164-1311f6c1f058.jpg', '使用双动圈 + 动铁 三单元发声 / 均衡自然声音 高保真石墨烯振膜 / 25 道工序打磨 / 弹力磨砂线材 Pro 小米圈铁耳机 孕育万物的天空和大地,时刻传达着声音的释放与组合,更是寻找灵感的源头,鸟鸣、流水、雷响、风啸不同的声音互相交融,共同演奏出自然的本真。 小米圈铁耳机 Pro 使用双“动圈”单元+“动铁”单元,将三个单元共同融入到同一个耳机中,双“动圈”的醇厚低音,让声音更加扎实稳重,石墨烯材料的加入,则让声音的细节更为丰富。“动铁”的高音透亮,稳定自然,感受三频均衡的本色声音。随着声音的流淌,仿佛置身自然,听见这些细节,让声音一开始就感动内心。 双动圈+动铁,三单元发声,听见更多细节 为了可以真正实现高、中、低三频均衡,小米圈铁耳机 Pro  加入了双“动圈”单元,大动圈负责中低频,小动圈负责高频。在“动铁”单元的配合下,耳机的低频下潜深,中频声音扎实,而高频的细节展现更为丰富。那些刚刚好的声音,听在耳里,都在心里。 三频更均衡,声音更自然 我们听到的绝大多数乐器、人声,都在中低频段。为了让这部分声音更均衡、有感染力,我们都交由采用了石墨烯振膜的双动圈单元来负责,中低频更扎实,兼具丰富细节表现力。 石墨烯是目前自然界已知材料中轻薄、强度更高的材料,对声音的传导速度快,将它用作振膜材质,高频延展性能更好,细节丰富,声音清澈自然,更富穿透力。同时强度又是钢铁的100倍, 可以尽可能还原出电流信号, 真正发出高保真的好声音。 石墨烯振膜,让双动圈更有实力 小米圈铁耳机 Pro 的“动铁”单元依然采用自主研发的 "衔铁+驱动杆" 结构,让声音细腻真实,更为稳定,在电容分频器的作用下,让高中低音衔接更好,失真更少。不论当你听何种音乐,细腻的感情都会被准确还原,听每首歌就像读每个故事,时刻感动自己。 动铁单元设计,高频解析好,细节不失真 好的音乐人将情感与生活用真实的方式,转化为音乐传递给每个人,每首歌都是一个故事,铭刻在各自的记忆中,为了让故事更好的表达,小米圈铁耳机 Pro 在科学客观调音的基础上,再次邀请到荣获 4 次格莱美大奖的 Luca Bignardi,为小米圈铁耳机 Pro 进行主观调音,为的就是让每个喜爱音乐的人能够真切的感受到每一个故事,跟随内心,娓娓道来... 多种科学调音,让声音更鲜活,更温暖 当耳机真正为声音服务时,设计将不再只是修饰耳机外观的道具,它将会成为辅助声音的一部分,小米圈铁耳机 Pro 采用圆润的设计风格,45° 斜角入耳设计,在满足舒适的同时更保证了声音的完整呈现。精密金属音腔设计,让音乐沉于耳畔,更有声音质感,弹力 TPE 磨砂线材的选用,让耳机线更为坚固耐用,确保耳机长久使用。一副好耳机,让声音和外表一起美好。 全新的外观设计,和声音一起美好 好的设计需要灵感,而灵感源于生活,为了锁住声音的灵感,小米圈铁耳机 Pro 将耳塞设计成45°斜角式入耳,贴合耳道,满足佩戴舒适感的同时尽可能减少外界声音干扰,毫无保留地听自己爱的音乐。 45°斜角入耳,舒适佩戴 小米圈铁耳机 Pro 的线控麦克风从耳机整体设计风格出发,金属磨砂弹头造型,精致小巧,指压按键圆润舒适,听歌的同时,更能感知指尖上的金属质感。 小米圈铁耳机 Pro 的耳机线材选取 TPE 材质,作为一种具有橡胶的高弹性材质, 触感柔软、耐温等特性,用它做成耳机线,将更为抗拉、耐用并且不易缠绕。让好音乐的陪伴更长久。 小米圈铁耳机 Pro 的耳塞选取奶嘴级硅胶材质,触感柔软顺滑,减少了耳塞对皮肤的刺激,让肌肤倍感亲密,同时提供四对不同尺寸的耳塞套,让佩戴者根据不同需求选择,带上它,向自己喜爱的音乐问好! 用匠心打磨每一件产品,即使过程艰难复杂,也依然充满斗志,小米圈铁耳机 Pro 的诞生过程就是这样。25 道工序打造的金属音腔,每一处细节都精心打磨,一体成型钻石切割、细密 CD 纹雕刻、锆石喷砂、阳极氧化,千锤百炼,不放过每个细节,将金属打磨成入耳的艺术品,这就是小米圈铁耳机 Pro 对音乐执着,对好产品更要执着。 小米圈铁耳机 Pro 是铝合金音腔,采用了 CNC 钻石切割一刀成型工艺,加工精度高达0.01mm,这种工艺在对铝合金加工前都要进行工艺分析,选择合适的刀具及切削用量,将打磨成型,让耳机具有更细腻润泽的手感。 小米圈铁耳机 Pro 运用精密的 CD 纹处理,纹理细至 0.14mm,散发金属光泽,就像耳机的指纹一样。如此的精密打磨,只为让小米圈铁耳机 Pro 更具质感,让金属更光辉熠熠。 选用精细锆石喷砂,赋予小米圈铁耳机 Pro 细致均匀的外观,有效保证了耳机表面硬度,不易刮伤。出厂时,会在小米圈铁耳机 Pro 表层增加阳极处理,保证了美观程度和耐磨性,6μ的阳极厚度,坚固、耐磨,做传达好声音的艺术品。 拥有超过 700 项高于行业标准的苛刻测试,每一种测试都见证了小米圈铁耳机 Pro 的高品质, 从音乐品质到设计创新,再到匠心工艺,集合好耳机的所有亮点,都只为带给用户更好的音乐体验和使用感受,好的声音,一定需要千锤百炼 。', 149, 149, 10000, '', 0, 0, '2019-09-18 13:21:28', 0, '2019-09-18 13:21:28'), (10172, 'Bose QuietControl 30', '无线耳机 QC30耳塞式蓝牙降噪耳麦', 0, '/goods-img/966a8b32-f547-457c-9161-009d3113d584.jpg', '/goods-img/966a8b32-f547-457c-9161-009d3113d584.jpg', '

商品介绍加载中...

', 2498, 2498, 10000, '', 0, 0, '2019-09-18 13:21:28', 0, '2019-09-18 13:21:28'), (10173, 'Beats Solo3 Wireless', '头戴式 蓝牙无线耳机 手机耳机 游戏耳机 - 桀骜黑红(十周年版) MRQC2PA/A', 0, '/goods-img/72218e28-fc58-4aa0-b3cd-c1f2c764d25e.jpg', '/goods-img/72218e28-fc58-4aa0-b3cd-c1f2c764d25e.jpg', '

商品介绍加载中...

', 2268, 1698, 10000, '', 0, 0, '2019-09-18 13:21:28', 0, '2019-09-18 13:21:28'), (10174, '索尼(SONY)WH-1000XM3 高解析度无线蓝牙降噪 头戴式耳机(触控面板', '智能降噪 长久续航)黑色', 0, '/goods-img/4cc6c606-4d69-4f49-b10c-01cedeef813f.jpg', '/goods-img/4cc6c606-4d69-4f49-b10c-01cedeef813f.jpg', '详情加载中...', 2899, 2599, 10000, '', 0, 0, '2019-09-18 13:21:28', 0, '2019-09-18 13:21:28'), (10175, '雷蛇 Razer 北海巨妖标准版X', '北海巨妖标准版升级款 头戴式游戏耳机 电竞耳麦 7.1 电脑手机耳机 黑色', 0, '/goods-img/7345c467-6c2d-4f30-a73d-83d675d5208c.jpg', '/goods-img/7345c467-6c2d-4f30-a73d-83d675d5208c.jpg', '产品信息Product Information 产品规格Product Specifications 品牌介绍Brand Introduction 注意事项Warning & Caution 雷蛇产品在出厂时会进行检测,脚贴及USB接口处如有轻微划痕属于正常测试痕迹。 RAZER关于划痕的注意事项: 以上数据图片均为官方测试环境下结果,因使用环境/设备不同会存在一定的差异,仅供参考,数据请以实际为准!  1. 产品实物与外包装上的SN(序列号)必须一致; 2. 产品外包装不能严重破损,盒内的相关配件要齐全,不能有缺失; 3. 不能有明显的人为破损(表面有明显的人为划痕,使用及存在拆卸的痕迹); 4. 防伪标签不得撕开或损毁。 RAZER关于7天无理由退换货的注意事项: ', 349, 299, 10000, '', 0, 0, '2019-09-18 13:21:28', 0, '2019-09-18 13:21:28'), (10176, '森海塞尔(Sennheiser)MomentumTrueWireless 真无线蓝牙hifi发烧入耳式耳机 蓝牙5.0', '黑色', 0, '/goods-img/efea018e-8ab0-47f9-a3d4-260c8cd2de5f.jpg', '/goods-img/efea018e-8ab0-47f9-a3d4-260c8cd2de5f.jpg', '聆听带来改变 真     无     线     蓝     牙     HiFi     耳     机 MOMENTUM 真无线 懂你所需 全新的 MOMENTUM 真无线耳机,高品质的声音质量传承 MOMENTUM 品质,成为一款具有重要技术成就的新产品。 这款性能优异的蓝牙耳机融合音频质量、佩戴舒适性和精致设计及工艺。 全新的 MOMENTUM 透明聆听功能 防水防泼溅 电池使用时长 (4+8小时) 精雕细琢 经典优雅 高品质声音质量 智能降噪 智能触控操作 支持蓝牙5.0技术 智能触控操作 支持蓝牙 5.0技术 MOMENTUM真无线耳机采用Sennheiser发烧级别7毫米动圈驱动单元,可确保饱满的立体声效果,带来高保真音质,为苛刻的听者带来出色的高保真度。 高品质声音质量 两侧触摸区域都有单独的控制功能,您可以轻松使用右耳耳机语音访问智能助手(如苹果 Siri或Google智能助手)。 轻轻点击或滑动触摸界面,使用自然语音命令即可播放音乐、接听电话。 支持蓝牙5.0技术及编解码技术(包括AAC、Qualcomm apt-XTM和apt-X低延迟),这款耳机带来出众的连接稳定性和音频流畅性。 真正的无线体验 轻松适配周围环境 MOMENTUM 真无线耳机让你更好地感知外部环境,透明聆听让你能听到周围的环境声,从而更好地感知周围的环境,不需要摘掉耳机就能融入到自然的交谈之中。甚至在嘈杂的环境中,电话呼叫和语音交互也能够通过双话筒波束成形技术得以实现。 智能交互 通过自动开启/关闭和智能暂停功能,可以检测到耳机何时被收起来或者不使用,从而节约能源。 你的世界由你把控 通过双击右耳耳机开/关透明聆听功能 打开透明聆听=接收周围环境音 关闭透明聆听=物理降噪模式,不接收周围音 不需要摘掉耳机就可轻松地与周围人进行交谈。 4种尺寸的耳垫可选,均符合人体工程学设计,防水防泼溅,能够满足用户舒适佩戴的需求。 个性定制舒适体验 MOMENTUM真无线拥有4小时电池续航时间,可通过其带有集成电源的小巧耳机盒进行充电,从而享受长达12(4+8)小时的全天聆听乐趣,并满足未来所需。 镀金充电接触点 可磁性吸附到充电盒上 高保真7毫米动圈驱动单元 带来出色的声音重放 金属镭射表面 具有触控功能 多色 LED指示灯 用于语音信号拾取和透明聆听功能的话筒 舒适的入耳式 硅胶耳垫 便捷充电盒持久续航 注重细节、富于美感,这款小巧、 靓丽而轻盈的耳机是技术与艺术的 结合。它既是声音重放技术的成就,更是你耳畔精美的配饰。 质感黑色外壳,闪烁的金属镭射表面,镀金的充电接触点——时尚与功能融合于标志性的设计之中,带来优雅和实用感。 Sennheiser智能控制 MOMENTUM 真无线耳机提供了更为智能和个性化的体验,可以通过新款Sennheiser智能控制应用进行优化,根据个人喜好,利用内置音频EQ对声音进行微调。免费下载,兼容iOS 版本 11.0 及以上版本和Android 版本 7.0 及以上版本 ,简便直观的控制界面,为您的耳机提供个性化的配置和升级等功能。 APP 下载方法 Android 版本 7.0 及以上版本 打开链接下载APP https://share.weiyun.com/54byqjn iOS 版本 11.0 及以上版本 打开APP Store搜索 Sennheiser smart control 下载APP', 2399, 2399, 10000, '', 0, 0, '2019-09-18 13:21:28', 0, '2019-09-18 13:21:28'), (10177, 'Bose SoundSport Free', '真无线蓝牙耳机--黑色 运动耳机 防掉落耳塞', 0, '/goods-img/b3de8a39-e33c-432f-872f-46f4a1662498.jpg', '/goods-img/b3de8a39-e33c-432f-872f-46f4a1662498.jpg', '

商品介绍加载中...

', 1699, 1699, 10000, '', 0, 0, '2019-09-18 13:21:28', 0, '2019-09-18 13:21:28'), (10178, '华为原装降噪有线手机耳机Mate9 10P9P10Plus荣耀V9V10PlayNova2s9i8x 【送耳机收纳包】AM115半入耳式耳机-经典热卖款', '新蜂精选', 0, '/goods-img/d6565a7e-473b-4933-93c5-e646495c8c4c.jpg', '/goods-img/d6565a7e-473b-4933-93c5-e646495c8c4c.jpg', '详情加载中...', 99, 39, 10000, '', 0, 0, '2019-09-18 13:21:28', 0, '2019-09-18 13:21:28'), (10179, 'Apple 采用Lightning/闪电接头的 EarPods', '耳机', 0, '/goods-img/bf6ccbc4-d0d0-4fbb-b975-4becb9cb38f4.jpg', '/goods-img/bf6ccbc4-d0d0-4fbb-b975-4becb9cb38f4.jpg', '详情加载中...', 223, 223, 10000, '', 0, 0, '2019-09-18 13:21:28', 0, '2019-09-18 13:21:28'), (10180, 'Apple AirPods 配充电盒', '苹果蓝牙耳机', 0, '/goods-img/64768a8d-0664-4b29-88c9-2626578ffbd1.jpg', '/goods-img/64768a8d-0664-4b29-88c9-2626578ffbd1.jpg', '详情加载中...', 1246, 1246, 10000, '妙出新境界', 0, 0, '2019-09-18 13:21:35', 0, '2019-09-18 13:21:35'), (10181, '小米 Redmi AirDots', '真无线蓝牙耳机|分体式耳机 |收纳充电盒 |蓝牙5.0 |按键防触控操作', 51, '/goods-img/36d0fe8f-aa28-423c-81e7-82cab31b7598.jpg', '/goods-img/36d0fe8f-aa28-423c-81e7-82cab31b7598.jpg', '详情加载中...', 129, 129, 10000, '', 0, 0, '2019-09-18 13:21:35', 0, '2019-09-18 13:21:35'), (10182, '荣耀原装三键线控带麦半入耳式耳机AM116(尊爵版)适用于华为荣耀手机', '新蜂精选', 0, '/goods-img/6113a562-f3f1-408c-9b0d-78a84407caf7.jpg', '/goods-img/6113a562-f3f1-408c-9b0d-78a84407caf7.jpg', '

商品介绍加载中...

', 69, 49, 10000, '', 0, 0, '2019-09-18 13:21:35', 0, '2019-09-18 13:21:35'), (10183, '诺基亚(NOKIA)BH-705 银白色 5.0真无线蓝牙耳机迷你运动跑步音乐商务入耳式安卓苹果手机蓝牙耳机', '新蜂精选', 0, '/goods-img/abb13d3a-3445-4b26-b8e9-44cbec227b5d.jpg', '/goods-img/abb13d3a-3445-4b26-b8e9-44cbec227b5d.jpg', '详情加载中...', 499, 499, 10000, '', 0, 0, '2019-09-18 13:21:35', 0, '2019-09-18 13:21:35'), (10184, '华为耳机原装半入耳式有线mate9p10plus8x荣耀v20v10nova2s9iv9p9play 【标准版】华为AM115 白色-热卖款', '新蜂精选', 0, '/goods-img/fac9c3e9-4843-46d1-8668-7e2eac17ccf2.jpg', '/goods-img/fac9c3e9-4843-46d1-8668-7e2eac17ccf2.jpg', '

商品介绍加载中...

', 69, 39, 10000, '', 0, 0, '2019-09-18 13:21:35', 0, '2019-09-18 13:21:35'), (10185, 'Beats X 蓝牙无线', '入耳式耳机 带麦可通话 -桀骜黑红(十周年版) MRQA2PA/A', 0, '/goods-img/25910a34-e026-4954-87b0-c379999e1dd0.jpg', '/goods-img/25910a34-e026-4954-87b0-c379999e1dd0.jpg', '

商品介绍加载中...

', 1168, 799, 10000, '', 0, 0, '2019-09-18 13:21:35', 0, '2019-09-18 13:21:35'), (10186, '华为( HUAWEI) 华为无线耳机', '真无线蓝牙耳机 双耳蓝牙音乐耳机 Freebuds 2 无线耳机 陶瓷白', 0, '/goods-img/adf8cbc2-ccb9-408a-96d0-553848e111e9.jpg', '/goods-img/adf8cbc2-ccb9-408a-96d0-553848e111e9.jpg', '详情加载中...', 899, 799, 10000, '', 0, 0, '2019-09-18 13:21:35', 0, '2019-09-18 13:21:35'), (10187, '【自营仓次日达】moloke真无线蓝牙耳机双耳适用于苹果华为小米 运动跑步入耳式oppo迷你商务耳机 【1:1尊享版】自动弹窗+无线充电+可触控(热卖)', '新蜂精选', 51, '/goods-img/1e5645d1-24cb-48eb-9aaa-f729fa0db195.jpg', '/goods-img/1e5645d1-24cb-48eb-9aaa-f729fa0db195.jpg', '

商品介绍加载中...

', 359, 199, 10000, '', 0, 0, '2019-09-18 13:21:35', 0, '2019-09-18 13:21:35'), (10188, 'Beats Powerbeats Pro', '完全无线高性能耳机 真无线蓝牙运动耳机 象牙白', 0, '/goods-img/e028c016-6793-49a3-8b0f-d0102a415d21.jpg', '/goods-img/e028c016-6793-49a3-8b0f-d0102a415d21.jpg', '详情加载中...', 1888, 1888, 10000, '', 0, 0, '2019-09-18 13:21:35', 0, '2019-09-18 13:21:35'), (10189, '纽曼(Newmine)NM-LK06 全兼容线控音乐手机耳机 白色', '新蜂精选', 0, '/goods-img/0b02244f-6908-4ccb-a9d2-ccb5a462e30e.jpg', '/goods-img/0b02244f-6908-4ccb-a9d2-ccb5a462e30e.jpg', '

商品介绍加载中...

', 9, 9, 10000, '', 0, 0, '2019-09-18 13:21:35', 0, '2019-09-18 13:21:35'), (10190, '索尼(SONY)重低音立体声耳机MDR-XB55AP 黑色', '新蜂精选', 0, '/goods-img/eec7b009-a9ff-45cd-a7be-4051eb7b3c22.jpg', '/goods-img/eec7b009-a9ff-45cd-a7be-4051eb7b3c22.jpg', '*黑色实物偏灰,请以实物为准 Bass Booster低音增强器技术可呈现紧实深邃低频。 12 毫米驱动单元和110dB/mW 的高灵敏度,呈现高质感音效。 人体工学设计的倾斜入耳方式,让耳塞能够深入耳朵内部,呈现出色的隔音效果,同时带来舒适的佩戴感和高音质的享受。 耳塞能够深入耳朵内部,呈现出色的隔音效果,同时为您带来舒适的佩戴感和高音质的享受。 采用混合两种硬度硅胶的耳塞套: 核心部分使用硬质材料保持音质,减少因耳塞变形导致的声音失真; 外围部分柔软材料提高了耳塞密闭性,让您能长时间舒适佩戴。 *线控的可用性及操作因智能手机而异 耳机线表面细小沟壑,减少容易引起缠绕的摩擦,使导线不容易纠结在一起,方便欣赏音乐和携带。 防缠绕耳机线 盲点设计 便携袋 防尘滤网 导线滑块 4种尺寸耳塞套 摘下耳机的耳塞套,可见保护单元的网罩,用来防止异物和灰尘堵塞单元,使耳机经久耐听。 在左耳外壳和耳机线的连接处设有浮点,凭手指触摸就能判别左右耳,方便操作。 随机附赠收纳袋一只,保护你心爱的耳机。 利用导线滑块来调整左右耳机线的长度,也能够减少收纳耳机时容易出现的缠线现象 提供4对不同尺寸(SS、S、M、L)的耳塞套(M号出厂时已安装至耳机上),根据你的耳洞大小自由更换,获得良好的隔音效果,佩戴舒适。 ● 立体声耳机 ● 混合硅胶耳塞(SS/S/M/L 每种尺寸2个) *M号出厂时安装至本耳机。 ● 便携袋(×1) *EXTRA BASS 和 EXTRABASS 是索尼公司的商标', 229, 185, 10000, '', 0, 0, '2019-09-18 13:21:35', 0, '2019-09-18 13:21:35'), (10191, '索尼(SONY)WI-1000X Hi-Res颈挂式 入耳式', '无线蓝牙耳机 高音质降噪耳机 手机通话 黑色', 0, '/goods-img/1c4adfba-f2f4-4ab3-8520-c28b0a437b7b.jpg', '/goods-img/1c4adfba-f2f4-4ab3-8520-c28b0a437b7b.jpg', '详情加载中...', 2399, 1499, 10000, '', 0, 0, '2019-09-18 13:21:35', 0, '2019-09-18 13:21:35'), (10192, '小米耳机 圈铁Pro 入耳式有线运动音乐耳机耳麦', '新蜂精选', 51, '/goods-img/b1530f7f-d286-4eb1-8d2b-3c2a74fa9f06.jpg', '/goods-img/b1530f7f-d286-4eb1-8d2b-3c2a74fa9f06.jpg', '使用双动圈 + 动铁 三单元发声 / 均衡自然声音 高保真石墨烯振膜 / 25 道工序打磨 / 弹力磨砂线材 Pro 小米圈铁耳机 孕育万物的天空和大地,时刻传达着声音的释放与组合,更是寻找灵感的源头,鸟鸣、流水、雷响、风啸不同的声音互相交融,共同演奏出自然的本真。 小米圈铁耳机 Pro 使用双“动圈”单元+“动铁”单元,将三个单元共同融入到同一个耳机中,双“动圈”的醇厚低音,让声音更加扎实稳重,石墨烯材料的加入,则让声音的细节更为丰富。“动铁”的高音透亮,稳定自然,感受三频均衡的本色声音。随着声音的流淌,仿佛置身自然,听见这些细节,让声音一开始就感动内心。 双动圈+动铁,三单元发声,听见更多细节 为了可以真正实现高、中、低三频均衡,小米圈铁耳机 Pro  加入了双“动圈”单元,大动圈负责中低频,小动圈负责高频。在“动铁”单元的配合下,耳机的低频下潜深,中频声音扎实,而高频的细节展现更为丰富。那些刚刚好的声音,听在耳里,都在心里。 三频更均衡,声音更自然 我们听到的绝大多数乐器、人声,都在中低频段。为了让这部分声音更均衡、有感染力,我们都交由采用了石墨烯振膜的双动圈单元来负责,中低频更扎实,兼具丰富细节表现力。 石墨烯是目前自然界已知材料中轻薄、强度更高的材料,对声音的传导速度快,将它用作振膜材质,高频延展性能更好,细节丰富,声音清澈自然,更富穿透力。同时强度又是钢铁的100倍, 可以尽可能还原出电流信号, 真正发出高保真的好声音。 石墨烯振膜,让双动圈更有实力 小米圈铁耳机 Pro 的“动铁”单元依然采用自主研发的 "衔铁+驱动杆" 结构,让声音细腻真实,更为稳定,在电容分频器的作用下,让高中低音衔接更好,失真更少。不论当你听何种音乐,细腻的感情都会被准确还原,听每首歌就像读每个故事,时刻感动自己。 动铁单元设计,高频解析好,细节不失真 好的音乐人将情感与生活用真实的方式,转化为音乐传递给每个人,每首歌都是一个故事,铭刻在各自的记忆中,为了让故事更好的表达,小米圈铁耳机 Pro 在科学客观调音的基础上,再次邀请到荣获 4 次格莱美大奖的 Luca Bignardi,为小米圈铁耳机 Pro 进行主观调音,为的就是让每个喜爱音乐的人能够真切的感受到每一个故事,跟随内心,娓娓道来... 多种科学调音,让声音更鲜活,更温暖 当耳机真正为声音服务时,设计将不再只是修饰耳机外观的道具,它将会成为辅助声音的一部分,小米圈铁耳机 Pro 采用圆润的设计风格,45° 斜角入耳设计,在满足舒适的同时更保证了声音的完整呈现。精密金属音腔设计,让音乐沉于耳畔,更有声音质感,弹力 TPE 磨砂线材的选用,让耳机线更为坚固耐用,确保耳机长久使用。一副好耳机,让声音和外表一起美好。 全新的外观设计,和声音一起美好 好的设计需要灵感,而灵感源于生活,为了锁住声音的灵感,小米圈铁耳机 Pro 将耳塞设计成45°斜角式入耳,贴合耳道,满足佩戴舒适感的同时尽可能减少外界声音干扰,毫无保留地听自己爱的音乐。 45°斜角入耳,舒适佩戴 小米圈铁耳机 Pro 的线控麦克风从耳机整体设计风格出发,金属磨砂弹头造型,精致小巧,指压按键圆润舒适,听歌的同时,更能感知指尖上的金属质感。 小米圈铁耳机 Pro 的耳机线材选取 TPE 材质,作为一种具有橡胶的高弹性材质, 触感柔软、耐温等特性,用它做成耳机线,将更为抗拉、耐用并且不易缠绕。让好音乐的陪伴更长久。 小米圈铁耳机 Pro 的耳塞选取奶嘴级硅胶材质,触感柔软顺滑,减少了耳塞对皮肤的刺激,让肌肤倍感亲密,同时提供四对不同尺寸的耳塞套,让佩戴者根据不同需求选择,带上它,向自己喜爱的音乐问好! 用匠心打磨每一件产品,即使过程艰难复杂,也依然充满斗志,小米圈铁耳机 Pro 的诞生过程就是这样。25 道工序打造的金属音腔,每一处细节都精心打磨,一体成型钻石切割、细密 CD 纹雕刻、锆石喷砂、阳极氧化,千锤百炼,不放过每个细节,将金属打磨成入耳的艺术品,这就是小米圈铁耳机 Pro 对音乐执着,对好产品更要执着。 小米圈铁耳机 Pro 是铝合金音腔,采用了 CNC 钻石切割一刀成型工艺,加工精度高达0.01mm,这种工艺在对铝合金加工前都要进行工艺分析,选择合适的刀具及切削用量,将打磨成型,让耳机具有更细腻润泽的手感。 小米圈铁耳机 Pro 运用精密的 CD 纹处理,纹理细至 0.14mm,散发金属光泽,就像耳机的指纹一样。如此的精密打磨,只为让小米圈铁耳机 Pro 更具质感,让金属更光辉熠熠。 选用精细锆石喷砂,赋予小米圈铁耳机 Pro 细致均匀的外观,有效保证了耳机表面硬度,不易刮伤。出厂时,会在小米圈铁耳机 Pro 表层增加阳极处理,保证了美观程度和耐磨性,6μ的阳极厚度,坚固、耐磨,做传达好声音的艺术品。 拥有超过 700 项高于行业标准的苛刻测试,每一种测试都见证了小米圈铁耳机 Pro 的高品质, 从音乐品质到设计创新,再到匠心工艺,集合好耳机的所有亮点,都只为带给用户更好的音乐体验和使用感受,好的声音,一定需要千锤百炼 。', 149, 149, 10000, '', 0, 0, '2019-09-18 13:21:35', 0, '2019-09-18 13:21:35'), (10193, 'Bose QuietControl 30', '无线耳机 QC30耳塞式蓝牙降噪耳麦', 0, '/goods-img/02cf272e-9062-4d4b-8b7f-7058f0472efa.jpg', '/goods-img/02cf272e-9062-4d4b-8b7f-7058f0472efa.jpg', '

商品介绍加载中...

', 2498, 2498, 10000, '', 0, 0, '2019-09-18 13:21:35', 0, '2019-09-18 13:21:35'), (10194, 'Beats Solo3 Wireless', '头戴式 蓝牙无线耳机 手机耳机 游戏耳机 - 桀骜黑红(十周年版) MRQC2PA/A', 0, '/goods-img/af77eaba-fd00-4ec8-b0e6-928372a0741d.jpg', '/goods-img/af77eaba-fd00-4ec8-b0e6-928372a0741d.jpg', '

商品介绍加载中...

', 2268, 1698, 10000, '', 0, 0, '2019-09-18 13:21:35', 0, '2019-09-18 13:21:35'), (10195, '索尼 WH-1000XM3 头戴式耳机', '高解析度无线蓝牙降噪(触控面板 智能降噪 长久续航)黑色', 20, '/goods-img/0dc503b2-90a2-4971-9723-c085a1844b76.jpg', '/goods-img/0dc503b2-90a2-4971-9723-c085a1844b76.jpg', '详情加载中...', 2899, 2599, 10000, '智能降噪 长久续航', 0, 0, '2019-09-18 13:21:35', 0, '2019-09-18 17:42:20'), (10196, '雷蛇 Razer 北海巨妖标准版X', '北海巨妖标准版升级款 头戴式游戏耳机 电竞耳麦 7.1 电脑手机耳机 黑色', 0, '/goods-img/0cc81546-1408-4140-af95-0341a7778b6c.jpg', '/goods-img/0cc81546-1408-4140-af95-0341a7778b6c.jpg', '产品信息Product Information 产品规格Product Specifications 品牌介绍Brand Introduction 注意事项Warning & Caution 雷蛇产品在出厂时会进行检测,脚贴及USB接口处如有轻微划痕属于正常测试痕迹。 RAZER关于划痕的注意事项: 以上数据图片均为官方测试环境下结果,因使用环境/设备不同会存在一定的差异,仅供参考,数据请以实际为准!  1. 产品实物与外包装上的SN(序列号)必须一致; 2. 产品外包装不能严重破损,盒内的相关配件要齐全,不能有缺失; 3. 不能有明显的人为破损(表面有明显的人为划痕,使用及存在拆卸的痕迹); 4. 防伪标签不得撕开或损毁。 RAZER关于7天无理由退换货的注意事项: ', 349, 299, 10000, '', 0, 0, '2019-09-18 13:21:35', 0, '2019-09-18 13:21:35'), (10197, '森海塞尔(Sennheiser)MomentumTrueWireless 真无线蓝牙hifi发烧入耳式耳机 蓝牙5.0', '黑色', 0, '/goods-img/768e79e1-e875-4691-855d-262346451d22.jpg', '/goods-img/768e79e1-e875-4691-855d-262346451d22.jpg', '聆听带来改变 真     无     线     蓝     牙     HiFi     耳     机 MOMENTUM 真无线 懂你所需 全新的 MOMENTUM 真无线耳机,高品质的声音质量传承 MOMENTUM 品质,成为一款具有重要技术成就的新产品。 这款性能优异的蓝牙耳机融合音频质量、佩戴舒适性和精致设计及工艺。 全新的 MOMENTUM 透明聆听功能 防水防泼溅 电池使用时长 (4+8小时) 精雕细琢 经典优雅 高品质声音质量 智能降噪 智能触控操作 支持蓝牙5.0技术 智能触控操作 支持蓝牙 5.0技术 MOMENTUM真无线耳机采用Sennheiser发烧级别7毫米动圈驱动单元,可确保饱满的立体声效果,带来高保真音质,为苛刻的听者带来出色的高保真度。 高品质声音质量 两侧触摸区域都有单独的控制功能,您可以轻松使用右耳耳机语音访问智能助手(如苹果 Siri或Google智能助手)。 轻轻点击或滑动触摸界面,使用自然语音命令即可播放音乐、接听电话。 支持蓝牙5.0技术及编解码技术(包括AAC、Qualcomm apt-XTM和apt-X低延迟),这款耳机带来出众的连接稳定性和音频流畅性。 真正的无线体验 轻松适配周围环境 MOMENTUM 真无线耳机让你更好地感知外部环境,透明聆听让你能听到周围的环境声,从而更好地感知周围的环境,不需要摘掉耳机就能融入到自然的交谈之中。甚至在嘈杂的环境中,电话呼叫和语音交互也能够通过双话筒波束成形技术得以实现。 智能交互 通过自动开启/关闭和智能暂停功能,可以检测到耳机何时被收起来或者不使用,从而节约能源。 你的世界由你把控 通过双击右耳耳机开/关透明聆听功能 打开透明聆听=接收周围环境音 关闭透明聆听=物理降噪模式,不接收周围音 不需要摘掉耳机就可轻松地与周围人进行交谈。 4种尺寸的耳垫可选,均符合人体工程学设计,防水防泼溅,能够满足用户舒适佩戴的需求。 个性定制舒适体验 MOMENTUM真无线拥有4小时电池续航时间,可通过其带有集成电源的小巧耳机盒进行充电,从而享受长达12(4+8)小时的全天聆听乐趣,并满足未来所需。 镀金充电接触点 可磁性吸附到充电盒上 高保真7毫米动圈驱动单元 带来出色的声音重放 金属镭射表面 具有触控功能 多色 LED指示灯 用于语音信号拾取和透明聆听功能的话筒 舒适的入耳式 硅胶耳垫 便捷充电盒持久续航 注重细节、富于美感,这款小巧、 靓丽而轻盈的耳机是技术与艺术的 结合。它既是声音重放技术的成就,更是你耳畔精美的配饰。 质感黑色外壳,闪烁的金属镭射表面,镀金的充电接触点——时尚与功能融合于标志性的设计之中,带来优雅和实用感。 Sennheiser智能控制 MOMENTUM 真无线耳机提供了更为智能和个性化的体验,可以通过新款Sennheiser智能控制应用进行优化,根据个人喜好,利用内置音频EQ对声音进行微调。免费下载,兼容iOS 版本 11.0 及以上版本和Android 版本 7.0 及以上版本 ,简便直观的控制界面,为您的耳机提供个性化的配置和升级等功能。 APP 下载方法 Android 版本 7.0 及以上版本 打开链接下载APP https://share.weiyun.com/54byqjn iOS 版本 11.0 及以上版本 打开APP Store搜索 Sennheiser smart control 下载APP', 2399, 2399, 10000, '', 0, 0, '2019-09-18 13:21:35', 0, '2019-09-18 13:21:35'), (10198, 'Bose SoundSport Free', '真无线蓝牙耳机--黑色 运动耳机 防掉落耳塞', 0, '/goods-img/d3370c50-e853-4546-a032-35073eb192ff.jpg', '/goods-img/d3370c50-e853-4546-a032-35073eb192ff.jpg', '

商品介绍加载中...

', 1699, 1699, 10000, '', 0, 0, '2019-09-18 13:21:35', 0, '2019-09-18 13:21:35'), (10199, '华为原装降噪有线手机耳机Mate9 10P9P10Plus荣耀V9V10PlayNova2s9i8x 【送耳机收纳包】AM115半入耳式耳机-经典热卖款', '新蜂精选', 0, '/goods-img/0cff5ace-7ab9-43a7-91fe-fb3550829577.jpg', '/goods-img/0cff5ace-7ab9-43a7-91fe-fb3550829577.jpg', '详情加载中...', 99, 39, 10000, '', 0, 0, '2019-09-18 13:21:35', 0, '2019-09-18 13:21:35'), (10200, 'Apple 采用Lightning/闪电接头的 EarPods', '耳机', 0, '/goods-img/7b8bcf01-0abe-4155-b1f4-e57a6b8fc36a.jpg', '/goods-img/7b8bcf01-0abe-4155-b1f4-e57a6b8fc36a.jpg', '详情加载中...', 223, 223, 10000, '', 0, 0, '2019-09-18 13:21:35', 0, '2019-09-18 13:21:35'), (10201, '迪奥(Dior)烈艳蓝金唇膏滋润999# 3.5g 经典正红色', '(口红 保湿滋润 气质显白 不挑皮) (新老包装随机)', 0, '/goods-img/6b0bd268-40b1-4abf-a19b-95df7cb4d722.jpg', '/goods-img/6b0bd268-40b1-4abf-a19b-95df7cb4d722.jpg', '

商品介绍加载中...

', 500, 315, 10000, '', 0, 0, '2019-09-18 13:24:47', 0, '2019-09-18 13:24:47'), (10202, '迪奥(Dior)烈艳蓝金唇膏-哑光999# 3.5g 传奇红(口红', '雾面质地 显色持久 显白 正红色 李佳琦推荐)', 86, '/goods-img/d8d4ac7e-7189-459a-aef2-7116f723cb0b.jpg', '/goods-img/d8d4ac7e-7189-459a-aef2-7116f723cb0b.jpg', '详情加载中...', 400, 315, 10000, '', 0, 0, '2019-09-18 13:24:47', 0, '2019-09-18 13:24:47'), (10203, '海囤全球 魅可(MAC)经典唇膏 子弹头口红3g', 'Chili 秀智色/小辣椒色', 86, '/goods-img/18aca3b8-d024-47d3-a971-fb51d374b1ae.jpg', '/goods-img/18aca3b8-d024-47d3-a971-fb51d374b1ae.jpg', '详情加载中...', 170, 155, 10000, '', 0, 0, '2019-09-18 13:24:47', 0, '2019-09-18 13:24:47'), (10204, '卡姿兰(Carslan)轻甜唇爱随心盒1.4g*4(13#暧昧 16#炽烈 18#嫉妒', '19#欲望 唇盒 口红 七夕礼物 情人节礼物)', 0, '/goods-img/44c8198e-f63a-45e0-8eff-789338de65f8.jpg', '/goods-img/44c8198e-f63a-45e0-8eff-789338de65f8.jpg', '关联销售入口 1 (1) 商品介绍加载中...', 99, 89, 10000, '', 0, 0, '2019-09-18 13:24:47', 0, '2019-09-18 13:24:47'), (10205, '【联名限量版】MANSLY口红套装中国风口红情人节女朋友生日礼物唇釉彩妆女磁扣锦绣红妆口红礼盒彩妆 锦绣红妆口红礼盒(6支)', '新蜂精选', 86, '/goods-img/c081314e-8f67-44f9-a27e-aad6c3f29343.jpg', '/goods-img/c081314e-8f67-44f9-a27e-aad6c3f29343.jpg', '

商品介绍加载中...

', 295, 295, 10000, '', 0, 0, '2019-09-18 13:24:47', 0, '2019-09-18 13:24:47'), (10206, '迪奥(Dior)滋润999礼盒套装(烈艳蓝金999#3.5g 经典正红色+香氛小样1ml*3+礼盒)(小样和礼盒款式随机)', '新蜂精选', 0, '/goods-img/39c69481-6d13-4d84-bc1e-7dca612667f0.jpg', '/goods-img/39c69481-6d13-4d84-bc1e-7dca612667f0.jpg', '

商品介绍加载中...

', 379, 379, 10000, '', 0, 0, '2019-09-18 13:24:47', 0, '2019-09-18 13:24:47'), (10207, '圣罗兰(YSL)莹亮纯魅唇膏12#(圆管口红)4.5g 斩男色', '新蜂精选', 86, '/goods-img/b4335e82-c9e1-4264-92e4-e324a601fedb.jpg', '/goods-img/b4335e82-c9e1-4264-92e4-e324a601fedb.jpg', '详情加载中...', 320, 320, 10000, '', 0, 0, '2019-09-18 13:24:47', 0, '2019-09-18 13:24:47'), (10208, '圣罗兰(YSL)纯口红1#(正红色)3.8g', '新蜂精选', 86, '/goods-img/57d0bf26-0a0c-4027-8a2b-deeaa29905ee.jpg', '/goods-img/57d0bf26-0a0c-4027-8a2b-deeaa29905ee.jpg', '详情加载中...', 350, 320, 10000, '', 0, 0, '2019-09-18 13:24:47', 0, '2019-09-18 13:24:47'), (10209, '纪梵希高定香榭天鹅绒唇膏306#(小羊皮口红 法式红 雾面哑光', '持久锁色)新老包装随机发货', 86, '/goods-img/f30bd8cb-aadd-43aa-8615-2c4795ee7f5f.jpg', '/goods-img/f30bd8cb-aadd-43aa-8615-2c4795ee7f5f.jpg', '详情加载中...', 355, 355, 10000, '', 0, 0, '2019-09-18 13:24:47', 0, '2019-09-18 13:24:47'), (10210, '【联名款】MANSLY口红套装红鸾心动口红礼盒中国风开运红情人节女朋友生日礼物唇釉颐和园同款彩妆口红 红鸾心动口红礼盒(6支)', '新蜂精选', 86, '/goods-img/f128ad98-fe4d-4264-96e3-6393b6cc98f1.jpg', '/goods-img/f128ad98-fe4d-4264-96e3-6393b6cc98f1.jpg', '

商品介绍加载中...

', 195, 195, 10000, '', 0, 0, '2019-09-18 13:24:47', 0, '2019-09-18 13:24:47'), (10211, '海囤全球 迪奥(Dior)烈艳蓝金唇膏 口红', '3.5g 999号 正红色', 86, '/goods-img/8fcdb86b-e826-4c1b-af3c-33a9d590c4b0.jpg', '/goods-img/8fcdb86b-e826-4c1b-af3c-33a9d590c4b0.jpg', '详情加载中...', 410, 258, 10000, '', 0, 0, '2019-09-18 13:24:47', 0, '2019-09-18 13:24:47'), (10212, '圣罗兰(YSL)纯口红13#(正橘色)3.8g', '新蜂精选', 86, '/goods-img/53a4a428-8ca2-4d19-937d-15d18f324237.jpg', '/goods-img/53a4a428-8ca2-4d19-937d-15d18f324237.jpg', '详情加载中...', 320, 320, 10000, '', 0, 0, '2019-09-18 13:24:47', 0, '2019-09-18 13:24:47'), (10213, '海囤全球 魅可(MAC)磨砂系列 雾面丝绒哑光子弹头口红', '3g 316 devoted to chili 泫雅色', 86, '/goods-img/2da55bd1-046f-4ac2-b1b9-56ab00bb9db1.jpg', '/goods-img/2da55bd1-046f-4ac2-b1b9-56ab00bb9db1.jpg', '详情加载中...', 249, 165, 10000, '', 0, 0, '2019-09-18 13:24:47', 0, '2019-09-18 13:24:47'), (10214, '【情人礼物】香奈儿Chanel 口红/唇膏可可小姐水亮/丝绒系列润唇保湿口红配玫瑰花礼盒 丝绒系列', '43#斩男色', 86, '/goods-img/247722ea-c87a-4283-806c-bc9fe57f2253.jpg', '/goods-img/247722ea-c87a-4283-806c-bc9fe57f2253.jpg', '详情加载中...', 299, 298, 10000, '', 0, 0, '2019-09-18 13:24:47', 0, '2019-09-18 13:24:47'), (10215, '迪奥(Dior)口红礼盒套装(烈艳蓝金唇膏哑光#999 3.5g正红色+香氛小样1ml*3随机+随机礼盒样式)', '新蜂精选', 86, '/goods-img/ab1a0ced-954c-4857-92f4-f7c833d9d54a.jpg', '/goods-img/ab1a0ced-954c-4857-92f4-f7c833d9d54a.jpg', '

商品介绍加载中...

', 379, 379, 10000, '', 0, 0, '2019-09-18 13:24:47', 0, '2019-09-18 13:24:47'), (10216, '圣罗兰(YSL)纯口红52# 3.8g', '新蜂精选', 86, '/goods-img/1eefadae-5f62-4abd-b283-077e7b6d9193.jpg', '/goods-img/1eefadae-5f62-4abd-b283-077e7b6d9193.jpg', '详情加载中...', 340, 320, 10000, '', 0, 0, '2019-09-18 13:24:47', 0, '2019-09-18 13:24:47'), (10217, '海囤全球 汤姆福特 TOM', 'FORD TF口红 经典黑金唇膏 3g 16 SCARLET ROUGE 复古番茄红', 0, '/goods-img/da12f5cf-2728-446a-a3bd-b78baf7056ff.jpg', '/goods-img/da12f5cf-2728-446a-a3bd-b78baf7056ff.jpg', '详情加载中...', 429, 375, 10000, '', 0, 0, '2019-09-18 13:24:47', 0, '2019-09-18 13:24:47'), (10218, '迪奥(Dior)烈艳蓝金口红唇膏 028# 3.5g', '珊瑚红 (滋润保湿 持久显色 粉嫩少女 摩洛哥王妃 幸运色)', 86, '/goods-img/7030b9b6-b650-4d9d-9446-e27dab8afa1f.jpg', '/goods-img/7030b9b6-b650-4d9d-9446-e27dab8afa1f.jpg', '详情加载中...', 400, 315, 10000, '', 0, 0, '2019-09-18 13:24:47', 0, '2019-09-18 13:24:47'), (10219, '迪奥(Dior)烈艳蓝金唇膏520# 3.5g 玫瑰红(口红', '缎光 滋润保湿 长效持妆 玫红色 斩男色 告白色 粉红色)', 86, '/goods-img/96a91f11-e634-4e28-be13-db8b4732463e.jpg', '/goods-img/96a91f11-e634-4e28-be13-db8b4732463e.jpg', '详情加载中...', 360, 315, 10000, '', 0, 0, '2019-09-18 13:24:47', 0, '2019-09-18 13:24:47'), (10220, '海囤全球 迪奥(Dior)烈艳蓝金唇膏 口红', '3.5g 999号 哑光-经典正红', 86, '/goods-img/fe048831-384d-46b2-beec-5549f7902c11.jpg', '/goods-img/fe048831-384d-46b2-beec-5549f7902c11.jpg', '详情加载中...', 410, 255, 10000, '', 0, 0, '2019-09-18 13:24:47', 0, '2019-09-18 13:24:47'), (10221, '欧莱雅(LOREAL)纷泽滋润唇膏RC301复古魅红3.7g(金管 口红女 滋润显色)', '新蜂精选', 86, '/goods-img/b7495e02-fc4c-417a-8101-ccfc75a5a475.jpg', '/goods-img/b7495e02-fc4c-417a-8101-ccfc75a5a475.jpg', '品牌介绍Brand Description         巴黎欧莱雅通过将科技和美丽的结合,不断谋求创新、研发新的产品配方,以合理的价格,为消费者提供品质的产品和服务。自1907年安全合成染发剂的诞生,如今巴黎欧莱雅的产品已从染发剂扩展到了护肤、彩妆等诸多领域,在中国,巴黎欧莱雅的五大产品线为护肤系列、彩妆系列、家用染发系列、洗护发系列及男士护肤系列。为了将美的产品融于美的文化、艺术、理念,将“从指尖到发梢”的美丽带给全世界的人们,巴黎欧莱雅在全世界范围精心选择各行业明星,组成“梦之队”来见证巴黎欧莱雅的实力,从各个不同的角度来讲述巴黎欧莱雅美丽无疆界的气势,并使“巴黎欧莱雅,你值得拥有!”“Because you are worth it!”的美丽概念成为一种文化!', 135, 99, 10000, '', 0, 0, '2019-09-18 13:24:47', 0, '2019-09-18 13:24:47'), (10222, '阿玛尼(Armani) 口红女士唇釉 生日礼物/表白礼物', '红管#405番茄红 【李佳琪推荐omg】', 86, '/goods-img/75fdac25-1cfa-4a9b-957d-805ac706f32c.jpg', '/goods-img/75fdac25-1cfa-4a9b-957d-805ac706f32c.jpg', '

商品介绍加载中...

', 366, 285, 10000, '', 0, 0, '2019-09-18 13:24:47', 0, '2019-09-18 13:24:47'), (10223, '美宝莲(MAYBELLINE)绝色持久唇膏雾感哑光系列R09PM 3.9g(女皇色口红新老包装)', '新蜂精选', 86, '/goods-img/1055e30e-3d98-4dca-8b79-8d0b5a09a37b.jpg', '/goods-img/1055e30e-3d98-4dca-8b79-8d0b5a09a37b.jpg', '

商品介绍加载中...

', 122, 106, 10000, '', 0, 0, '2019-09-18 13:24:47', 0, '2019-09-18 13:24:47'), (10224, '【专柜正品】迪奥999Dior口红唇膏烈艳蓝金 哑光滋润520/888/999送礼礼品套装 烈艳蓝金', '844#橘红色赠礼盒礼袋', 86, '/goods-img/7b52a7bc-0ecf-41c4-b079-d162511c9530.jpg', '/goods-img/7b52a7bc-0ecf-41c4-b079-d162511c9530.jpg', '

商品介绍加载中...

', 339, 260, 10000, '', 0, 0, '2019-09-18 13:24:47', 0, '2019-09-18 13:24:47'), (10225, '迪奥(Dior)烈艳蓝金唇膏滋润999# 3.5g 经典正红色', '(口红 保湿滋润 气质显白 不挑皮) (新老包装随机)', 0, '/goods-img/bb05b83f-bb91-4300-b78f-23986ba8c0dd.jpg', '/goods-img/bb05b83f-bb91-4300-b78f-23986ba8c0dd.jpg', '

商品介绍加载中...

', 500, 315, 10000, '', 0, 0, '2019-09-18 13:25:08', 0, '2019-09-18 13:25:08'), (10226, '迪奥(Dior)烈艳蓝金唇膏-哑光999# 3.5g 传奇红(口红', '雾面质地 显色持久 显白 正红色 李佳琦推荐)', 86, '/goods-img/67280dcf-bf32-49c1-b99b-9d86bb2ffaac.jpg', '/goods-img/67280dcf-bf32-49c1-b99b-9d86bb2ffaac.jpg', '详情加载中...', 400, 315, 10000, '', 0, 0, '2019-09-18 13:25:08', 0, '2019-09-18 13:25:08'), (10227, '海囤全球 魅可(MAC)经典唇膏 子弹头口红3g', 'Chili 秀智色/小辣椒色', 86, '/goods-img/2b678c5d-820c-4174-bc0c-5a65ff9501b6.jpg', '/goods-img/2b678c5d-820c-4174-bc0c-5a65ff9501b6.jpg', '详情加载中...', 170, 155, 10000, '', 0, 0, '2019-09-18 13:25:08', 0, '2019-09-18 13:25:08'), (10228, '卡姿兰(Carslan)轻甜唇爱随心盒1.4g*4(13#暧昧 16#炽烈 18#嫉妒', '19#欲望 唇盒 口红 七夕礼物 情人节礼物)', 0, '/goods-img/3f513cd6-bb5f-407d-8550-24550873d83b.jpg', '/goods-img/3f513cd6-bb5f-407d-8550-24550873d83b.jpg', '关联销售入口 1 (1) 商品介绍加载中...', 99, 89, 10000, '', 0, 0, '2019-09-18 13:25:08', 0, '2019-09-18 13:25:08'), (10229, '【联名限量版】MANSLY口红套装中国风口红情人节女朋友生日礼物唇釉彩妆女磁扣锦绣红妆口红礼盒彩妆 锦绣红妆口红礼盒(6支)', '新蜂精选', 86, '/goods-img/d82ba7f0-6c92-4254-bfb2-71b3f8b1dfda.jpg', '/goods-img/d82ba7f0-6c92-4254-bfb2-71b3f8b1dfda.jpg', '

商品介绍加载中...

', 295, 295, 10000, '', 0, 0, '2019-09-18 13:25:08', 0, '2019-09-18 13:25:08'), (10230, '迪奥(Dior)滋润999礼盒套装(烈艳蓝金999#3.5g 经典正红色+香氛小样1ml*3+礼盒)(小样和礼盒款式随机)', '新蜂精选', 0, '/goods-img/f6b1195a-3231-4e81-a676-866ee838748f.jpg', '/goods-img/f6b1195a-3231-4e81-a676-866ee838748f.jpg', '

商品介绍加载中...

', 379, 379, 10000, '', 0, 0, '2019-09-18 13:25:08', 0, '2019-09-18 13:25:08'), (10231, '圣罗兰(YSL)莹亮纯魅唇膏12#(圆管口红)4.5g 斩男色', '新蜂精选', 86, '/goods-img/359bb052-5fea-4390-bbe6-4cb9e1c19273.jpg', '/goods-img/359bb052-5fea-4390-bbe6-4cb9e1c19273.jpg', '详情加载中...', 320, 320, 10000, '', 0, 0, '2019-09-18 13:25:08', 0, '2019-09-18 13:25:08'), (10232, '圣罗兰(YSL)纯口红1#(正红色)3.8g', '新蜂精选', 86, '/goods-img/a42498e5-d912-447b-9360-0659d2d55c42.jpg', '/goods-img/a42498e5-d912-447b-9360-0659d2d55c42.jpg', '详情加载中...', 350, 320, 10000, '', 0, 0, '2019-09-18 13:25:08', 0, '2019-09-18 13:25:08'), (10233, '纪梵希高定香榭天鹅绒唇膏306#', '(小羊皮口红 法式红 雾面哑光 持久锁色)新老包装随机发货', 86, '/goods-img/04949c0e-87df-445b-96dd-29e7fc69f734.jpg', '/goods-img/04949c0e-87df-445b-96dd-29e7fc69f734.jpg', '详情加载中...', 355, 355, 10000, '雾面哑光 持久锁色', 0, 0, '2019-09-18 13:25:08', 0, '2019-09-18 17:40:58'), (10234, '【联名款】MANSLY口红套装红鸾心动口红礼盒中国风开运红情人节女朋友生日礼物唇釉颐和园同款彩妆口红 红鸾心动口红礼盒(6支)', '新蜂精选', 86, '/goods-img/a9cd71ad-2db0-4876-9ead-c51233040220.jpg', '/goods-img/a9cd71ad-2db0-4876-9ead-c51233040220.jpg', '

商品介绍加载中...

', 195, 195, 10000, '', 0, 0, '2019-09-18 13:25:08', 0, '2019-09-18 13:25:08'), (10235, '海囤全球 迪奥(Dior)烈艳蓝金唇膏 口红', '3.5g 999号 正红色', 86, '/goods-img/49d2acf7-55e5-4293-a7da-5929740e1168.jpg', '/goods-img/49d2acf7-55e5-4293-a7da-5929740e1168.jpg', '详情加载中...', 410, 258, 10000, '', 0, 0, '2019-09-18 13:25:08', 0, '2019-09-18 13:25:08'), (10236, '圣罗兰(YSL)纯口红13#(正橘色)3.8g', '新蜂精选', 86, '/goods-img/b0142d40-6adb-4d64-b5b2-6e4a34656990.jpg', '/goods-img/b0142d40-6adb-4d64-b5b2-6e4a34656990.jpg', '详情加载中...', 320, 320, 10000, '', 0, 0, '2019-09-18 13:25:08', 0, '2019-09-18 13:25:08'), (10237, 'MAC 雾面丝绒哑光子弹头口红', '磨砂系列 3g 316 devoted to chili 泫雅色', 86, '/goods-img/1930d79b-88bd-4c5c-8510-0697c9ad2578.jpg', '/goods-img/1930d79b-88bd-4c5c-8510-0697c9ad2578.jpg', '详情加载中...', 249, 165, 10000, '雾面丝绒哑光', 0, 0, '2019-09-18 13:25:08', 0, '2019-09-18 17:41:42'), (10238, '【情人礼物】香奈儿Chanel 口红/唇膏可可小姐水亮/丝绒系列润唇保湿口红配玫瑰花礼盒 丝绒系列', '43#斩男色', 86, '/goods-img/70219912-838c-487b-8c3c-761b00de80e9.jpg', '/goods-img/70219912-838c-487b-8c3c-761b00de80e9.jpg', '详情加载中...', 299, 298, 10000, '', 0, 0, '2019-09-18 13:25:08', 0, '2019-09-18 13:25:08'), (10239, '迪奥(Dior)口红礼盒套装(烈艳蓝金唇膏哑光#999 3.5g正红色+香氛小样1ml*3随机+随机礼盒样式)', '新蜂精选', 86, '/goods-img/cbce65ee-28b3-4822-895a-38243ee506e7.jpg', '/goods-img/cbce65ee-28b3-4822-895a-38243ee506e7.jpg', '

商品介绍加载中...

', 379, 379, 10000, '', 0, 0, '2019-09-18 13:25:08', 0, '2019-09-18 13:25:08'), (10240, '圣罗兰(YSL)纯口红52# 3.8g', '新蜂精选', 86, '/goods-img/abff57bf-247b-4881-9589-e1336049c3ba.jpg', '/goods-img/abff57bf-247b-4881-9589-e1336049c3ba.jpg', '详情加载中...', 340, 320, 10000, '', 0, 0, '2019-09-18 13:25:08', 0, '2019-09-18 13:25:08'), (10241, '海囤全球 汤姆福特 TOM', 'FORD TF口红 经典黑金唇膏 3g 16 SCARLET ROUGE 复古番茄红', 0, '/goods-img/ba0cd1e9-cded-427b-8692-e8e2a0d00e9f.jpg', '/goods-img/ba0cd1e9-cded-427b-8692-e8e2a0d00e9f.jpg', '详情加载中...', 429, 375, 10000, '', 0, 0, '2019-09-18 13:25:08', 0, '2019-09-18 13:25:08'), (10242, '迪奥(Dior)烈艳蓝金口红唇膏 028# 3.5g', '珊瑚红 (滋润保湿 持久显色 粉嫩少女 摩洛哥王妃 幸运色)', 86, '/goods-img/ea87e780-ed4c-447d-bd22-e88e4742721e.jpg', '/goods-img/ea87e780-ed4c-447d-bd22-e88e4742721e.jpg', '详情加载中...', 400, 315, 10000, '', 0, 0, '2019-09-18 13:25:08', 0, '2019-09-18 13:25:08'), (10243, '迪奥(Dior)烈艳蓝金唇膏520# 3.5g 玫瑰红(口红', '缎光 滋润保湿 长效持妆 玫红色 斩男色 告白色 粉红色)', 86, '/goods-img/dde0b711-58b0-49fb-972c-7a71d6ec30f1.jpg', '/goods-img/dde0b711-58b0-49fb-972c-7a71d6ec30f1.jpg', '详情加载中...', 360, 315, 10000, '', 0, 0, '2019-09-18 13:25:08', 0, '2019-09-18 13:25:08'), (10244, '海囤全球 迪奥(Dior)烈艳蓝金唇膏 口红', '3.5g 999号 哑光-经典正红', 86, '/goods-img/79247aeb-2903-47b0-a711-ac94e22ddd54.jpg', '/goods-img/79247aeb-2903-47b0-a711-ac94e22ddd54.jpg', '详情加载中...', 410, 255, 10000, '', 0, 0, '2019-09-18 13:25:08', 0, '2019-09-18 13:25:08'), (10245, '欧莱雅(LOREAL)纷泽滋润唇膏RC301复古魅红3.7g(金管 口红女 滋润显色)', '新蜂精选', 86, '/goods-img/3b420562-b449-448d-ae50-e20aab136e1b.jpg', '/goods-img/3b420562-b449-448d-ae50-e20aab136e1b.jpg', '品牌介绍Brand Description         巴黎欧莱雅通过将科技和美丽的结合,不断谋求创新、研发新的产品配方,以合理的价格,为消费者提供品质的产品和服务。自1907年安全合成染发剂的诞生,如今巴黎欧莱雅的产品已从染发剂扩展到了护肤、彩妆等诸多领域,在中国,巴黎欧莱雅的五大产品线为护肤系列、彩妆系列、家用染发系列、洗护发系列及男士护肤系列。为了将美的产品融于美的文化、艺术、理念,将“从指尖到发梢”的美丽带给全世界的人们,巴黎欧莱雅在全世界范围精心选择各行业明星,组成“梦之队”来见证巴黎欧莱雅的实力,从各个不同的角度来讲述巴黎欧莱雅美丽无疆界的气势,并使“巴黎欧莱雅,你值得拥有!”“Because you are worth it!”的美丽概念成为一种文化!', 135, 99, 10000, '', 0, 0, '2019-09-18 13:25:08', 0, '2019-09-18 13:25:08'), (10246, '阿玛尼(Armani) 口红女士唇釉 生日礼物/表白礼物', '红管#405番茄红 【李佳琪推荐omg】', 86, '/goods-img/db866c68-e526-42cf-a0b5-520254f30b76.jpg', '/goods-img/db866c68-e526-42cf-a0b5-520254f30b76.jpg', '

商品介绍加载中...

', 366, 285, 10000, '', 0, 0, '2019-09-18 13:25:08', 0, '2019-09-18 13:25:08'), (10247, '美宝莲(MAYBELLINE)绝色持久唇膏雾感哑光系列R09PM 3.9g(女皇色口红新老包装)', '新蜂精选', 86, '/goods-img/63d0a187-627d-4edb-870e-717969ad2bd0.jpg', '/goods-img/63d0a187-627d-4edb-870e-717969ad2bd0.jpg', '

商品介绍加载中...

', 122, 106, 10000, '', 0, 0, '2019-09-18 13:25:08', 0, '2019-09-18 13:25:08'), (10248, '【专柜正品】迪奥999Dior口红唇膏烈艳蓝金 哑光滋润520/888/999送礼礼品套装 烈艳蓝金', '844#橘红色赠礼盒礼袋', 86, '/goods-img/9822b4a5-9fd2-435b-bdd1-5bbcdc6fdfdf.jpg', '/goods-img/9822b4a5-9fd2-435b-bdd1-5bbcdc6fdfdf.jpg', '

商品介绍加载中...

', 339, 260, 10000, '', 0, 0, '2019-09-18 13:25:08', 0, '2019-09-18 13:25:08'), (10249, 'Apple Macbook Air 13.3 ', 'Core i5 8G 128G SSD 笔记本电脑 轻薄本 银色 MQD32CH/A', 0, '/goods-img/2d827a7e-fb30-493d-840a-cb21766814fd.jpg', '/goods-img/2d827a7e-fb30-493d-840a-cb21766814fd.jpg', '商品介紹頁面素材由Apple提供', 6928, 5999, 10000, '', 0, 0, '2019-09-18 13:25:52', 0, '2019-09-18 13:25:52'), (10250, 'Apple 2019款 Macbook Pro 13.3', '【带触控栏】八代i5 8G 256G RP645显卡 银色 苹果笔记本电脑 MUHR2CH/A', 0, '/goods-img/465936e0-40ad-4968-b868-4bea20c7beec.jpg', '/goods-img/465936e0-40ad-4968-b868-4bea20c7beec.jpg', '商品介紹頁面素材由Apple提供', 11499, 10699, 10000, '', 0, 0, '2019-09-18 13:25:52', 0, '2019-09-18 13:25:52'), (10251, 'Apple MacBook Air 13.3 ', 'Core i5 8G 256G SSD 银色 笔记本电脑 轻薄本 Z0UU00056原MQD42CH/A', 0, '/goods-img/a4132109-8f18-4399-affd-a81fad6902c8.jpg', '/goods-img/a4132109-8f18-4399-affd-a81fad6902c8.jpg', '商品介紹頁面素材由Apple提供', 7999, 7168, 10000, '', 0, 0, '2019-09-18 13:25:52', 0, '2019-09-18 13:25:52'), (10252, 'Apple 2019款 MacBook Air 13.3 ', 'Retina屏 八代i5 8G 256G SSD 银色 笔记本电脑 轻薄本 MVFL2CH/A', 0, '/goods-img/65b62668-3be5-48b0-a40c-bd05826a38c2.jpg', '/goods-img/65b62668-3be5-48b0-a40c-bd05826a38c2.jpg', '商品介紹頁面素材由Apple提供', 10399, 9799, 10000, '', 0, 0, '2019-09-18 13:25:52', 0, '2019-09-18 13:25:52'), (10253, 'Apple 2019款 MacBook Air 13.3 ', 'Retina屏 八代i5 8G 128G SSD 深空灰 笔记本电脑 轻薄本 MVFH2CH/A', 0, '/goods-img/cb899039-a705-473d-9785-f245a6ed4d89.jpg', '/goods-img/cb899039-a705-473d-9785-f245a6ed4d89.jpg', '商品介紹頁面素材由Apple提供', 8899, 8499, 10000, '', 0, 0, '2019-09-18 13:25:52', 0, '2019-09-18 13:25:52'), (10254, 'Apple 2019款 MacBook Air 13.3 ', 'Retina屏 八代i5 8G 128G SSD 银色 笔记本电脑 轻薄本 MVFK2CH/A', 0, '/goods-img/7810bc9d-236f-4386-a0ef-45a831b49bf2.jpg', '/goods-img/7810bc9d-236f-4386-a0ef-45a831b49bf2.jpg', '商品介紹頁面素材由Apple提供', 8899, 8499, 10000, '再次倾心', 0, 0, '2019-09-18 13:25:52', 0, '2019-09-18 13:25:52'), (10255, 'Apple MacBook Air 13.3 ', '| 定制升级 Core i7 8G 128G SSD硬盘 银色 笔记本电脑 轻薄本 Z0UU00022', 0, '/goods-img/53019ece-5e61-4de9-8eac-e1f00a4ef7e3.jpg', '/goods-img/53019ece-5e61-4de9-8eac-e1f00a4ef7e3.jpg', '

商品介绍加载中...

', 8056, 6968, 10000, '', 0, 0, '2019-09-18 13:25:52', 0, '2019-09-18 13:25:52'), (10256, 'Apple 2019款 Macbook Pro 13.3', '【带触控栏】八代i5 8G 256G RP645显卡 深空灰 苹果笔记本电脑 MUHP2CH/A', 0, '/goods-img/f08404a7-0459-4289-aa60-dd1735c95bbe.jpg', '/goods-img/f08404a7-0459-4289-aa60-dd1735c95bbe.jpg', '商品介紹頁面素材由Apple提供', 11499, 10699, 10000, '', 0, 0, '2019-09-18 13:25:52', 0, '2019-09-18 13:25:52'), (10257, '苹果(Apple) MacBook Air', '苹果笔记本电脑 13.3英寸轻薄本 购买套餐更实惠 2017款/i5/8GB/128GB/D32', 0, '/goods-img/83740c28-473c-4954-b0dc-3cadab5a87d1.jpg', '/goods-img/83740c28-473c-4954-b0dc-3cadab5a87d1.jpg', '

商品介绍加载中...

', 6200, 5488, 10000, '', 0, 0, '2019-09-18 13:25:52', 0, '2019-09-18 13:25:52'), (10258, 'Apple 2019款 MacBook Air 13.3 ', 'Retina屏 八代i5 8G 256G SSD 深空灰 笔记本电脑 轻薄本 MVFJ2CH/A', 0, '/goods-img/78957148-4c0c-4194-bc46-7360d7b1aa65.jpg', '/goods-img/78957148-4c0c-4194-bc46-7360d7b1aa65.jpg', '商品介紹頁面素材由Apple提供', 10399, 9799, 10000, '', 0, 0, '2019-09-18 13:25:52', 0, '2019-09-18 13:25:52'), (10259, 'Apple 2019新品 Macbook Pro 13.3', '【带触控栏】八代i5 8G 256G 深空灰 笔记本电脑 轻薄本 MV962CH/A', 0, '/goods-img/85787c16-8443-4db0-9cae-a811a20a0832.jpg', '/goods-img/85787c16-8443-4db0-9cae-a811a20a0832.jpg', '商品介紹頁面素材由Apple提供', 13899, 12999, 10000, '', 0, 0, '2019-09-18 13:25:52', 0, '2019-09-18 13:25:52'), (10260, 'Apple 2019款 MacBook Air 13.3 ', 'Retina屏 八代i5 8G 256G SSD 金色 苹果笔记本电脑 轻薄本 MVFN2CH/A', 0, '/goods-img/82bdafc6-5828-495e-b77c-21598938b896.jpg', '/goods-img/82bdafc6-5828-495e-b77c-21598938b896.jpg', '商品介紹頁面素材由Apple提供', 10399, 9799, 10000, '', 0, 0, '2019-09-18 13:25:52', 0, '2019-09-18 13:25:52'), (10261, 'APPLE 苹果2018年19新款MacBook air笔记本电脑13.3英寸超薄笔记本', '金色 i5/8GB内存/128GB闪存【19新款】', 0, '/goods-img/270cdf75-8a7f-410e-8f2f-8eeba24f0503.jpg', '/goods-img/270cdf75-8a7f-410e-8f2f-8eeba24f0503.jpg', '

商品介绍加载中...

', 8899, 7888, 10000, '', 0, 0, '2019-09-18 13:25:52', 0, '2019-09-18 13:25:52'), (10262, 'Apple 2019新品 Macbook Pro 15.4', '【带触控栏】全新九代六核i7 16G 256G 深空灰 笔记本电脑轻薄本MV902CH/A', 0, '/goods-img/7928eb46-9e1c-420e-a8ab-6c358d01891b.jpg', '/goods-img/7928eb46-9e1c-420e-a8ab-6c358d01891b.jpg', '商品介紹頁面素材由Apple提供', 18199, 17099, 10000, '', 0, 0, '2019-09-18 13:25:52', 0, '2019-09-18 13:25:52'), (10263, 'APPLE 苹果MacBook air苹果笔记本电脑13.3英寸超薄笔记本', '标配+防水手提包+苹果原装鼠标版(下单送大礼包) i5+8GB内存+128GB闪存【D32】', 0, '/goods-img/11968b35-9431-4b1c-a648-6ff46945ebf4.jpg', '/goods-img/11968b35-9431-4b1c-a648-6ff46945ebf4.jpg', '

商品介绍加载中...

', 6988, 5988, 10000, '', 0, 0, '2019-09-18 13:25:52', 0, '2019-09-18 13:25:52'), (10264, 'APPLE苹果 MacBook Air13.3英寸轻薄笔记本电脑2017款', '官方标配【购套餐版送大礼包】 i5+8GB内存+128GB闪存【D32】', 0, '/goods-img/fb08ec83-2960-47f7-8679-8b78896c30d5.jpg', '/goods-img/fb08ec83-2960-47f7-8679-8b78896c30d5.jpg', '

商品介绍加载中...

', 6188, 5488, 10000, '', 0, 0, '2019-09-18 13:25:52', 0, '2019-09-18 13:25:52'), (10265, 'Apple 2019款 MacBook Air 13.3 ', 'Retina屏 八代i5 8G 128G SSD 金色 笔记本电脑 轻薄本 MVFM2CH/A', 0, '/goods-img/50748763-c0d6-4e73-80e5-864818fa3246.jpg', '/goods-img/50748763-c0d6-4e73-80e5-864818fa3246.jpg', '商品介紹頁面素材由Apple提供', 8899, 8499, 10000, '', 0, 0, '2019-09-18 13:25:52', 0, '2019-09-18 13:25:52'), (10266, 'Apple 2019款 Macbook Pro 13.3', '【带触控栏】八代i5 8G 128G RP645显卡 深空灰 苹果笔记本电脑 MUHN2CH/A', 0, '/goods-img/fe9e33a1-fbd0-4278-931f-825fef4ffb62.jpg', '/goods-img/fe9e33a1-fbd0-4278-931f-825fef4ffb62.jpg', '商品介紹頁面素材由Apple提供', 9999, 9499, 10000, '', 0, 0, '2019-09-18 13:25:52', 0, '2019-09-18 13:25:52'), (10267, 'Apple MacBook Air 13.3 ', '定制升级 Core i7 8G 256G SSD硬盘 银色 笔记本电脑 轻薄本 Z0UU0004J', 0, '/goods-img/0340d6b2-54bf-42a2-96f4-f35c5f47bb2d.jpg', '/goods-img/0340d6b2-54bf-42a2-96f4-f35c5f47bb2d.jpg', '商品介紹頁面素材由Apple提供', 9656, 8499, 10000, '', 0, 0, '2019-09-18 13:25:52', 0, '2019-09-18 13:25:52'), (10268, 'Apple 2019新品 Macbook Pro 15.4', '【带触控栏】九代八核i9 16G 512G 深空灰 笔记本电脑 轻薄本 MV912CH/A', 0, '/goods-img/33a29216-08d6-445b-b979-12d5de81d634.jpg', '/goods-img/33a29216-08d6-445b-b979-12d5de81d634.jpg', '商品介紹頁面素材由Apple提供', 21399, 20399, 10000, '', 0, 0, '2019-09-18 13:25:52', 0, '2019-09-18 13:25:52'), (10269, 'Apple 2019新品 Macbook Pro 13.3', '【带触控栏】八代i5 8G 256G 银色 笔记本电脑 轻薄本 MV992CH/A', 0, '/goods-img/a2afdb6c-69a7-4081-bd09-62174f9f5624.jpg', '/goods-img/a2afdb6c-69a7-4081-bd09-62174f9f5624.jpg', '商品介紹頁面素材由Apple提供  ', 13899, 12999, 10000, '', 0, 0, '2019-09-18 13:25:52', 0, '2019-09-18 13:25:52'), (10270, 'Apple Macbook Pro 13.3', '【带触控栏】Core i5 8G 512G SSD 银色 笔记本电脑 轻薄本 MR9V2CH/A', 0, '/goods-img/4da4fa5d-ee2d-4496-9950-e53b102f0e8e.jpg', '/goods-img/4da4fa5d-ee2d-4496-9950-e53b102f0e8e.jpg', '

商品介绍加载中...

', 14999, 13068, 10000, '', 0, 0, '2019-09-18 13:25:52', 0, '2019-09-18 13:25:52'), (10271, 'Apple 2019新品 Macbook Pro 15.4', '【带触控栏】全新九代六核i7 16G 256G 银色 笔记本电脑 轻薄本 MV922CH/A', 0, '/goods-img/49c9f6f8-11c2-4f57-98b9-daf12715b938.jpg', '/goods-img/49c9f6f8-11c2-4f57-98b9-daf12715b938.jpg', '商品介紹頁面素材由Apple提供', 18199, 17099, 10000, '', 0, 0, '2019-09-18 13:25:52', 0, '2019-09-18 13:25:52'), (10272, 'Apple 2019新品 Macbook Pro 13.3', '【带触控栏】八代i5 8G 512G 银色 笔记本电脑 轻薄本 MV9A2CH/A', 0, '/goods-img/9dd28614-7a17-4876-8cdd-232caf4154bc.jpg', '/goods-img/9dd28614-7a17-4876-8cdd-232caf4154bc.jpg', '商品介紹頁面素材由Apple提供', 15499, 14499, 10000, '', 0, 0, '2019-09-18 13:25:52', 0, '2019-09-18 13:25:52'), (10273, 'Apple 2019新品 Macbook Pro 15.4', '【带触控栏】九代八核i9 16G 512G 银色 笔记本电脑 轻薄本 MV932CH/A', 0, '/goods-img/2dcd61b8-f434-40ee-928f-c6e4ae934db8.jpg', '/goods-img/2dcd61b8-f434-40ee-928f-c6e4ae934db8.jpg', '商品介紹頁面素材由Apple提供', 21399, 20399, 10000, '', 0, 0, '2019-09-18 13:25:52', 0, '2019-09-18 13:25:52'), (10274, '【新品首发】苹果Apple MacBook Pro13.3英寸2019新款18/17苹果笔记本电脑', '19款灰色/256G/带bar/MUHP2CH/A', 0, '/goods-img/4dbbfbf1-80c0-4389-a02e-ca19fbeb5340.jpg', '/goods-img/4dbbfbf1-80c0-4389-a02e-ca19fbeb5340.jpg', '

商品介绍加载中...

', 12580, 10488, 10000, '', 0, 0, '2019-09-18 13:25:52', 0, '2019-09-18 13:25:52'), (10275, '【新品首发】苹果Apple MacBook Pro13.3英寸2019新款18/17苹果笔记本电脑', '19款灰色/128G/带bar/MUHN2CH/A', 0, '/goods-img/3b095a66-4001-4c69-9026-2e09139b5f11.jpg', '/goods-img/3b095a66-4001-4c69-9026-2e09139b5f11.jpg', '

商品介绍加载中...

', 10100, 9088, 10000, '', 0, 0, '2019-09-18 13:25:52', 0, '2019-09-18 13:25:52'), (10276, 'Apple 2019新品 Macbook Pro 13.3', '【带触控栏】八代i5 8G 512G 深空灰 苹果笔记本电脑 轻薄本 MV972CH/A', 0, '/goods-img/82fb6b31-1afe-4bcb-a243-5205ed32d3ee.jpg', '/goods-img/82fb6b31-1afe-4bcb-a243-5205ed32d3ee.jpg', '商品介紹頁面素材由Apple提供', 15499, 14499, 10000, '', 0, 0, '2019-09-18 13:25:52', 0, '2019-09-18 13:25:52'), (10277, 'Apple Macbook Pro 13.3', '【无触控栏】Core i5 8G 256G SSD 银色 笔记本电脑 轻薄本 MPXU2CH/A', 0, '/goods-img/73a8c7e9-40af-4e0a-9826-5f6374361e61.jpg', '/goods-img/73a8c7e9-40af-4e0a-9826-5f6374361e61.jpg', '

商品介绍加载中...

', 11299, 10199, 10000, '', 0, 0, '2019-09-18 13:25:52', 0, '2019-09-18 13:25:52'), (10278, 'Apple iPhone 11 (A2223)', '64GB 黑色 移动联通电信4G手机 双卡双待', 47, '/goods-img/4755f3e5-257c-424c-a5f4-63908061d6d9.jpg', '/goods-img/4755f3e5-257c-424c-a5f4-63908061d6d9.jpg', '

', 5499, 5499, 10000, '2019 新品', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 14:28:39'), (10279, 'Apple iPhone 11 (A2223)', '128GB 白色 移动联通电信4G手机 双卡双待', 47, '/goods-img/a0d09f94-9c46-4ee1-aaef-dfd132e7543e.jpg', '/goods-img/a0d09f94-9c46-4ee1-aaef-dfd132e7543e.jpg', '

', 5999, 5999, 10000, '2019 新品', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 14:35:30'), (10280, 'Apple iPhone 11 (A2223)', '128GB 紫色 移动联通电信4G手机 双卡双待', 47, '/goods-img/8dfe8ea9-2279-4132-a72b-4f8a52d002a4.jpg', '/goods-img/8dfe8ea9-2279-4132-a72b-4f8a52d002a4.jpg', '

', 5999, 5999, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10281, 'Apple iPhone 11 (A2223)', '64GB 红色 移动联通电信4G手机 双卡双待', 47, '/goods-img/7368f461-fd0a-4f37-bc8b-31d8ad3d6e95.jpg', '/goods-img/7368f461-fd0a-4f37-bc8b-31d8ad3d6e95.jpg', '

', 5499, 5499, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10282, 'Apple iPhone 11 (A2223)', '64GB 黄色 移动联通电信4G手机 双卡双待', 47, '/goods-img/cea55d85-b11e-4639-88ab-9403b05ce1e8.jpg', '/goods-img/cea55d85-b11e-4639-88ab-9403b05ce1e8.jpg', '

', 5499, 5499, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10283, 'Apple iPhone 11 (A2223)', '256GB 绿色 移动联通电信4G手机 双卡双待', 47, '/goods-img/075a188a-9045-45f0-9c67-1e42e0552aa2.jpg', '/goods-img/075a188a-9045-45f0-9c67-1e42e0552aa2.jpg', '

', 6799, 6799, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10284, 'Apple iPhone XR (A2108)', '128GB 黑色 移动联通电信4G手机 双卡双待', 47, '/goods-img/23ac3107-6309-40c8-bd28-164eb1186b62.jpg', '/goods-img/23ac3107-6309-40c8-bd28-164eb1186b62.jpg', '

商品介绍加载中...

', 5599, 5099, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10285, 'Apple iPhone XR (A2108)', '128GB 白色 移动联通电信4G手机 双卡双待', 47, '/goods-img/3f47c376-c603-43fc-bfe5-2daa985ff423.jpg', '/goods-img/3f47c376-c603-43fc-bfe5-2daa985ff423.jpg', '

商品介绍加载中...

', 5599, 5099, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10286, 'Apple iPhone XR (A2108)', '128GB 红色 移动联通电信4G手机 双卡双待', 47, '/goods-img/56cef3d7-41e6-4aad-825d-a3d423e74dfd.jpg', '/goods-img/56cef3d7-41e6-4aad-825d-a3d423e74dfd.jpg', '

商品介绍加载中...

', 5599, 5099, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10287, 'Apple iPhone XR (A2108)', '128GB 珊瑚色 移动联通电信4G手机 双卡双待', 47, '/goods-img/c2e3b2e4-1fc8-43f3-b133-6f4eae7faa5d.jpg', '/goods-img/c2e3b2e4-1fc8-43f3-b133-6f4eae7faa5d.jpg', '

商品介绍加载中...

', 5599, 5199, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10288, 'Apple iPhone XR (A2108)', '128GB 蓝色 移动联通电信4G手机 双卡双待', 47, '/goods-img/2f5079e9-57f3-490a-8d3d-5fd64207939d.jpg', '/goods-img/2f5079e9-57f3-490a-8d3d-5fd64207939d.jpg', '

商品介绍加载中...

', 5599, 5199, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10289, 'Apple iPhone XR (A2108)', '128GB 黄色 移动联通电信4G手机 双卡双待', 47, '/goods-img/b1259d73-7c5a-4eca-81eb-53a4e9bcc77e.jpg', '/goods-img/b1259d73-7c5a-4eca-81eb-53a4e9bcc77e.jpg', '

商品介绍加载中...

', 5599, 5199, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10290, 'Apple iPhone 11 Pro', 'Max (A2220) 64GB 暗夜绿色 移动联通电信4G手机 双卡双待', 47, '/goods-img/0656b280-66d9-430b-9d0d-e48bf379d89a.jpg', '/goods-img/0656b280-66d9-430b-9d0d-e48bf379d89a.jpg', '

', 9599, 9599, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10291, 'Apple iPhone 11 Pro', 'Max (A2220) 256GB 深空灰色 移动联通电信4G手机 双卡双待', 47, '/goods-img/77ce1f09-3900-4eff-8d97-e67fa8193a84.jpg', '/goods-img/77ce1f09-3900-4eff-8d97-e67fa8193a84.jpg', '

', 10899, 10899, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10292, 'Apple iPhone 11 Pro', 'Max (A2220) 64GB 金色 移动联通电信4G手机 双卡双待', 47, '/goods-img/e45be404-d582-4c1e-80e8-48073327551e.jpg', '/goods-img/e45be404-d582-4c1e-80e8-48073327551e.jpg', '

', 9599, 9599, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10293, 'Apple iPhone 11 Pro', 'Max (A2220) 512GB 银色 移动联通电信4G手机 双卡双待', 47, '/goods-img/76670f49-4556-40ae-b485-3b25dcdcb636.jpg', '/goods-img/76670f49-4556-40ae-b485-3b25dcdcb636.jpg', '

', 12699, 12699, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10294, 'Apple iPhone 7 (A1660)', '128G 黑色 移动联通电信4G手机', 47, '/goods-img/101abd40-e9a2-4ab0-9f4e-16569c9dbf82.jpg', '/goods-img/101abd40-e9a2-4ab0-9f4e-16569c9dbf82.jpg', '

商品介绍加载中...

', 3199, 2949, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10295, 'Apple iPhone 7 (A1660)', '128G 玫瑰金色 移动联通电信4G手机', 47, '/goods-img/6229468b-bcb7-4415-880a-aea3eef4eea2.jpg', '/goods-img/6229468b-bcb7-4415-880a-aea3eef4eea2.jpg', '

商品介绍加载中...

', 3199, 2929, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10296, 'Apple iPhone 7 (A1660)', '128G 金色 移动联通电信4G手机', 47, '/goods-img/1f5bb955-fbe7-451a-b12c-3e2115c53020.jpg', '/goods-img/1f5bb955-fbe7-451a-b12c-3e2115c53020.jpg', '

商品介绍加载中...

', 3199, 2929, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10297, 'Apple iPhone 7 (A1660)', '128G 银色 移动联通电信4G手机', 47, '/goods-img/9fc3c48f-c8e2-426b-915a-c32b0e72998d.jpg', '/goods-img/9fc3c48f-c8e2-426b-915a-c32b0e72998d.jpg', '

商品介绍加载中...

', 3199, 2929, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10298, 'Apple iPhone XS Max', '(A2104) 256GB 深空灰色 移动联通电信4G手机 双卡双待', 47, '/goods-img/ec4af4a5-0a53-4246-bd88-919b0541a55c.jpg', '/goods-img/ec4af4a5-0a53-4246-bd88-919b0541a55c.jpg', '详情加载中...', 9599, 8999, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10299, 'Apple iPhone XS Max', '(A2104) 256GB 金色 移动联通电信4G手机 双卡双待', 47, '/goods-img/b7d2373a-5a8c-4be5-a4ce-57b408c6d9f2.jpg', '/goods-img/b7d2373a-5a8c-4be5-a4ce-57b408c6d9f2.jpg', '

商品介绍加载中...

', 9599, 8999, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10300, 'Apple iPhone XS Max', '(A2104) 256GB 银色 移动联通电信4G手机 双卡双待', 47, '/goods-img/837aaf40-5797-4929-b162-a248bfe73b36.jpg', '/goods-img/837aaf40-5797-4929-b162-a248bfe73b36.jpg', '

商品介绍加载中...

', 9599, 8999, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10301, 'Apple iPhone 8 (A1863)', '64GB 深空灰色 移动联通电信4G手机', 47, '/goods-img/8ab049d8-5b2e-4b69-bef0-013bec414598.jpg', '/goods-img/8ab049d8-5b2e-4b69-bef0-013bec414598.jpg', '

商品介绍加载中...

', 3699, 3499, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10302, 'Apple iPhone 8 (A1863)', '64GB 银色 移动联通电信4G手机', 47, '/goods-img/eaeb6faf-2ead-4f5d-84d2-1629686a492c.jpg', '/goods-img/eaeb6faf-2ead-4f5d-84d2-1629686a492c.jpg', '

商品介绍加载中...

', 3699, 3499, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10303, 'Apple iPhone 8 (A1863)', '64GB 金色 移动联通电信4G手机', 47, '/goods-img/0611528c-73c8-4114-a1d8-d9387e771284.jpg', '/goods-img/0611528c-73c8-4114-a1d8-d9387e771284.jpg', '

商品介绍加载中...

', 3699, 3499, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10304, 'Apple iPhone 7 Plus', '(A1661) 128G 黑色 移动联通电信4G手机', 47, '/goods-img/dbafc182-23b7-442c-b9cb-0ea825a659a9.jpg', '/goods-img/dbafc182-23b7-442c-b9cb-0ea825a659a9.jpg', '

商品介绍加载中...

', 4199, 3699, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10305, 'Apple iPhone 7 Plus', '(A1661) 128G 玫瑰金色 移动联通电信4G手机', 47, '/goods-img/c227df08-9a26-430a-88a5-72c1e4da5b6e.jpg', '/goods-img/c227df08-9a26-430a-88a5-72c1e4da5b6e.jpg', '

商品介绍加载中...

', 4199, 3699, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10306, 'Apple iPhone 7 Plus', '(A1661) 128G 金色 移动联通电信4G手机', 47, '/goods-img/bf58f29f-75ed-411e-8255-3b9f802634f2.jpg', '/goods-img/bf58f29f-75ed-411e-8255-3b9f802634f2.jpg', '

商品介绍加载中...

', 4199, 3699, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10307, 'Apple iPhone 7 Plus', '(A1661) 128G 银色 移动联通电信4G手机', 47, '/goods-img/dfab7fee-e787-423d-9771-67e05b03b358.jpg', '/goods-img/dfab7fee-e787-423d-9771-67e05b03b358.jpg', '

商品介绍加载中...

', 4199, 3699, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10308, 'Apple iPhone XS (A2099)', '64GB 金色 移动联通4G手机', 47, '/goods-img/b3ff5475-9519-4d94-8f07-5840bb796e60.jpg', '/goods-img/b3ff5475-9519-4d94-8f07-5840bb796e60.jpg', '详情加载中...', 7299, 6299, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10309, 'Apple iPhone XS (A2099)', '64GB 深空灰色 移动联通4G手机', 47, '/goods-img/7cc8d012-cfaa-45c4-ba35-70ca46c8bd66.jpg', '/goods-img/7cc8d012-cfaa-45c4-ba35-70ca46c8bd66.jpg', '详情加载中...', 7299, 6299, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10310, 'Apple iPhone XS (A2099)', '256GB 银色 移动联通4G手机', 47, '/goods-img/776b459b-e981-434f-bbf7-635cafab7418.jpg', '/goods-img/776b459b-e981-434f-bbf7-635cafab7418.jpg', '详情加载中...', 10099, 7699, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10311, 'Apple iPhone 8 Plus', '(A1899) 64GB 深空灰色 移动联通4G手机', 47, '/goods-img/8eb2e38b-84e1-4f31-9dae-841800f68038.jpg', '/goods-img/8eb2e38b-84e1-4f31-9dae-841800f68038.jpg', '

商品介绍加载中...

', 4599, 3999, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10312, 'Apple iPhone 8 Plus', '(A1864) 64GB 金色 移动联通电信4G手机', 47, '/goods-img/58c6a2c3-d3f7-4b0a-b4ae-e649b1032087.jpg', '/goods-img/58c6a2c3-d3f7-4b0a-b4ae-e649b1032087.jpg', '

商品介绍加载中...

', 4799, 4399, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10313, 'Apple iPhone 8 Plus', '(A1864) 64GB 银色 移动联通电信4G手机', 47, '/goods-img/2839c451-3eaf-4820-8a15-1858ce339407.jpg', '/goods-img/2839c451-3eaf-4820-8a15-1858ce339407.jpg', '

商品介绍加载中...

', 4799, 4399, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10314, 'Apple 苹果 iPhone xr', '手机 双卡双待 黑色 全网通64G', 47, '/goods-img/35bbe123-c822-457c-aaf0-fdcd861bc06d.jpg', '/goods-img/35bbe123-c822-457c-aaf0-fdcd861bc06d.jpg', '

商品介绍加载中...

', 6199, 4598, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10315, 'Apple 苹果 iPhone xr', '手机 双卡双待 白色 全网通64G', 47, '/goods-img/0e565b23-554e-45d3-ac62-a2fb25be7f2c.jpg', '/goods-img/0e565b23-554e-45d3-ac62-a2fb25be7f2c.jpg', '

商品介绍加载中...

', 6199, 4658, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10316, 'Apple 苹果 iPhone xr', '手机 双卡双待 蓝色 全网通64G', 47, '/goods-img/c08b6ddc-735f-4d2c-b47f-1f0e7f62a9b1.jpg', '/goods-img/c08b6ddc-735f-4d2c-b47f-1f0e7f62a9b1.jpg', '

商品介绍加载中...

', 6199, 4698, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10317, 'Apple 苹果 iPhone xr', '手机 双卡双待 黄色 全网通64G', 47, '/goods-img/c09636de-93b1-444e-b00e-668506676443.jpg', '/goods-img/c09636de-93b1-444e-b00e-668506676443.jpg', '

商品介绍加载中...

', 6199, 4698, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10318, 'Apple 苹果 iPhone xr', '手机 双卡双待 红色 全网通128G', 47, '/goods-img/b26d8460-7ab5-4006-ba5c-e212ee0f31bd.jpg', '/goods-img/b26d8460-7ab5-4006-ba5c-e212ee0f31bd.jpg', '

商品介绍加载中...

', 6699, 5038, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10319, 'Apple 苹果 iPhone xr', '手机 双卡双待 珊瑚色 全网通64G', 47, '/goods-img/fab7cf40-9b7d-4141-8227-9ce7e02e8330.jpg', '/goods-img/fab7cf40-9b7d-4141-8227-9ce7e02e8330.jpg', '

商品介绍加载中...

', 6199, 4698, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10320, 'Apple iPhone 11 Pro', '(A2217) 256GB 暗夜绿色 移动联通电信4G手机 双卡双待', 47, '/goods-img/0025ad55-e260-4a00-be79-fa5b8c5ac0de.jpg', '/goods-img/0025ad55-e260-4a00-be79-fa5b8c5ac0de.jpg', '

', 9999, 9999, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10321, 'Apple iPhone 11 Pro', '(A2217) 64GB 深空灰色 移动联通电信4G手机 双卡双待', 47, '/goods-img/d0abbd2a-19ca-4ae7-9b3c-1eb4eb77c565.jpg', '/goods-img/d0abbd2a-19ca-4ae7-9b3c-1eb4eb77c565.jpg', '

', 8699, 8699, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10322, 'Apple iPhone 11 Pro', '(A2217) 64GB 银色 移动联通电信4G手机 双卡双待', 47, '/goods-img/7d192eff-938f-4e6d-8952-9d405707033e.jpg', '/goods-img/7d192eff-938f-4e6d-8952-9d405707033e.jpg', '

', 8699, 8699, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10323, '【换修无忧年付版】Apple iPhone 11 Pro', '(A2217) 512GB 金色 移动联通电信4G手机 双卡双待', 47, '/goods-img/38b3f3a9-7056-45a3-b183-ad46dc71f493.jpg', '/goods-img/38b3f3a9-7056-45a3-b183-ad46dc71f493.jpg', '

', 12598, 12598, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10324, 'Apple 苹果 iPhone 6s', 'Plus 4G手机 金色 全网通 128G', 47, '/goods-img/22febff2-db52-4f7a-8d16-414e755e788b.jpg', '/goods-img/22febff2-db52-4f7a-8d16-414e755e788b.jpg', '

商品介绍加载中...

', 3599, 2918, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10325, 'Apple 苹果 iPhone 6s', 'Plus 4G手机 玫瑰金 全网通 128G', 47, '/goods-img/dfb0d434-4d59-4fda-896a-1ebd9e4d9ece.jpg', '/goods-img/dfb0d434-4d59-4fda-896a-1ebd9e4d9ece.jpg', '

商品介绍加载中...

', 3599, 2918, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10326, 'Apple 苹果 iPhone 6s', 'Plus 4G手机 深空灰 全网通 128G', 47, '/goods-img/d3a4b902-8010-4619-89e4-96cb88e6d4e4.jpg', '/goods-img/d3a4b902-8010-4619-89e4-96cb88e6d4e4.jpg', '

商品介绍加载中...

', 3599, 2888, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10327, 'Apple 苹果 iPhone 6s', 'Plus 4G手机 银色 全网通 128G', 47, '/goods-img/b4b7e7d3-b7ba-4917-a1f9-70c52f28df9d.jpg', '/goods-img/b4b7e7d3-b7ba-4917-a1f9-70c52f28df9d.jpg', '

商品介绍加载中...

', 3599, 2988, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10328, '【二手9成新】Apple iPhone XSmax 苹果XSmax', '国行二手手机 XS Max 深空灰 64G', 47, '/goods-img/0514e529-6b3e-40d5-9183-84088ddb55e1.jpg', '/goods-img/0514e529-6b3e-40d5-9183-84088ddb55e1.jpg', '

商品介绍加载中...

', 7766, 6088, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10329, '【二手9成新】Apple iPhone XSmax 苹果XSmax', '国行二手手机 XS Max 金色 64G', 47, '/goods-img/a0dfd1ad-61ed-43ee-add4-74bdfea1d6c1.jpg', '/goods-img/a0dfd1ad-61ed-43ee-add4-74bdfea1d6c1.jpg', '

商品介绍加载中...

', 14999, 6088, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10330, '【二手9成新】Apple iPhone XSmax 苹果XSmax', '国行二手手机 XS Max 银色 256G', 47, '/goods-img/87b66719-fc17-4c97-a954-de8a78b42a09.jpg', '/goods-img/87b66719-fc17-4c97-a954-de8a78b42a09.jpg', '

商品介绍加载中...

', 14999, 6938, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10331, '【二手9成新】Apple iPhone 6s Plus', '苹果6sPlus 二手手机(送一年碎屏险) 玫瑰金色 64G 全网通', 47, '/goods-img/5b132b57-24e4-4d65-9cb8-3299dc0e9ed6.png', '/goods-img/5b132b57-24e4-4d65-9cb8-3299dc0e9ed6.png', '

商品介绍加载中...

', 1799, 1468, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10332, '【二手9成新】Apple iPhone 6s Plus', '苹果6sPlus 二手手机(送一年碎屏险) 金色 64G 全网通', 47, '/goods-img/f289ec14-e0e2-481e-a703-39eec00a1b15.png', '/goods-img/f289ec14-e0e2-481e-a703-39eec00a1b15.png', '

商品介绍加载中...

', 1799, 1499, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10333, '【二手9成新】Apple iPhone 6s Plus', '苹果6sPlus 二手手机(送一年碎屏险) 银色 64G 全网通', 47, '/goods-img/084208d0-4dc2-4f1a-aff4-4114616dfae1.png', '/goods-img/084208d0-4dc2-4f1a-aff4-4114616dfae1.png', '

商品介绍加载中...

', 1799, 1599, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10334, '【二手9成新】Apple iPhone 6s Plus', '苹果6sPlus 二手手机(送一年碎屏险) 深空灰色 64G 全网通', 47, '/goods-img/8a598420-0052-4551-b00a-b288b6c22a48.png', '/goods-img/8a598420-0052-4551-b00a-b288b6c22a48.png', '

商品介绍加载中...

', 1799, 1638, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10335, 'Apple 苹果 iPhone xr', '手机 双卡双待 白色 全网通 64G', 47, '/goods-img/6110a187-511f-45d0-8b59-ea2a75546a45.jpg', '/goods-img/6110a187-511f-45d0-8b59-ea2a75546a45.jpg', '

商品介绍加载中...

', 5499, 4699, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10336, 'Apple 苹果 iPhone xr', '手机 双卡双待 黑色 全网通 128G', 47, '/goods-img/41b10e86-857c-435c-b86d-d822e35450ab.jpg', '/goods-img/41b10e86-857c-435c-b86d-d822e35450ab.jpg', '

商品介绍加载中...

', 5699, 5079, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10337, 'Apple 苹果 iPhone xr', '手机 双卡双待 蓝色 全网通 64G', 47, '/goods-img/d38bcaab-7a0a-4f86-ad75-60ac74a308e6.jpg', '/goods-img/d38bcaab-7a0a-4f86-ad75-60ac74a308e6.jpg', '

商品介绍加载中...

', 5499, 4699, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10338, 'Apple 苹果 iPhone xr', '手机 双卡双待 黄色 全网通 128G', 47, '/goods-img/73fc7cb9-5b43-4bce-a2b3-a82516773de0.jpg', '/goods-img/73fc7cb9-5b43-4bce-a2b3-a82516773de0.jpg', '

商品介绍加载中...

', 5699, 5079, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10339, 'Apple 苹果 iPhone xr', '手机 双卡双待 珊瑚色 全网通 64G', 47, '/goods-img/00e53d76-db08-4ae2-864f-ca1cd7c8c32b.jpg', '/goods-img/00e53d76-db08-4ae2-864f-ca1cd7c8c32b.jpg', '

商品介绍加载中...

', 5499, 4699, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10340, '【二手95新】Apple iPhonex XSmax苹果x xsmax', '国行 二手手机 XS max金色 64G 全网通', 47, '/goods-img/5b9acfd4-7808-4b3b-bf5c-4b367667418c.jpg', '/goods-img/5b9acfd4-7808-4b3b-bf5c-4b367667418c.jpg', '

商品介绍加载中...

', 12999, 6088, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10341, '【二手95新】Apple iPhonex XSmax苹果x xsmax', '国行 二手手机 XS 金色 64G 全网通', 47, '/goods-img/cd2b481d-a4a2-4bc0-a4e1-784a28c37ef9.jpg', '/goods-img/cd2b481d-a4a2-4bc0-a4e1-784a28c37ef9.jpg', '

商品介绍加载中...

', 12999, 5299, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10342, '【二手95新】Apple iPhonex XSmax苹果x xsmax', '国行 二手手机 XS max灰色 256G 全网通', 47, '/goods-img/1d866674-4e57-483a-955f-5fd1a4f5d921.jpg', '/goods-img/1d866674-4e57-483a-955f-5fd1a4f5d921.jpg', '

商品介绍加载中...

', 12999, 6938, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10343, '【二手95新】Apple iPhonex XSmax苹果x xsmax', '国行 二手手机 XS max银色 64G 全网通', 47, '/goods-img/3f3e086e-e4be-464f-9c20-760430cab2df.jpg', '/goods-img/3f3e086e-e4be-464f-9c20-760430cab2df.jpg', '

商品介绍加载中...

', 12999, 6088, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10344, '【二手95新】Apple iPhonex XSmax苹果x xsmax', '国行 二手手机 XS 灰色 64G 全网通', 47, '/goods-img/4a4a0820-aad5-47d4-a926-f040fd090c96.jpg', '/goods-img/4a4a0820-aad5-47d4-a926-f040fd090c96.jpg', '

商品介绍加载中...

', 12999, 5299, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10345, '【二手95新】Apple iPhonex XSmax苹果x xsmax', '国行 二手手机 XS 银色 64G 全网通', 47, '/goods-img/a6b87d83-5ba7-4683-be17-43ab9aa043e3.jpg', '/goods-img/a6b87d83-5ba7-4683-be17-43ab9aa043e3.jpg', '

商品介绍加载中...

', 12999, 5299, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10346, '【二手9成新】Apple iPhone X 苹果X', '二手手机 深空灰色 64G 全网通', 47, '/goods-img/3cd13e20-2a00-4049-8768-0ba662df7e40.jpg', '/goods-img/3cd13e20-2a00-4049-8768-0ba662df7e40.jpg', '

商品介绍加载中...

', 3989, 3989, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10347, '【二手9成新】Apple iPhone X 苹果X', '二手手机 银色 64G 全网通', 47, '/goods-img/fc3db752-e0dc-4ae7-bac3-fd60ab8a1e17.jpg', '/goods-img/fc3db752-e0dc-4ae7-bac3-fd60ab8a1e17.jpg', '

商品介绍加载中...

', 4008, 4008, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10348, '【二手9成新】苹果7Plus手机 Apple iPhone7Plus 苹果7P', '二手手机 磨砂黑 128G 全网通', 47, '/goods-img/24b442e2-1bdd-4350-bbab-4e4d3d3445f1.jpg', '/goods-img/24b442e2-1bdd-4350-bbab-4e4d3d3445f1.jpg', '

商品介绍加载中...

', 2899, 2399, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10349, '【二手9成新】苹果7Plus手机 Apple iPhone7Plus 苹果7P', '二手手机 亮黑色 128G 全网通', 47, '/goods-img/7601e13f-de8e-449c-84be-65fbc7280cfc.png', '/goods-img/7601e13f-de8e-449c-84be-65fbc7280cfc.png', '

商品介绍加载中...

', 2899, 2399, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10350, '【二手9成新】苹果7Plus手机 Apple iPhone7Plus 苹果7P', '二手手机 玫瑰金 128G 全网通', 47, '/goods-img/771bc653-485b-4c5d-bca3-c84d3e90020d.jpg', '/goods-img/771bc653-485b-4c5d-bca3-c84d3e90020d.jpg', '

商品介绍加载中...

', 2666, 2399, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10351, '【二手9成新】苹果7Plus手机 Apple iPhone7Plus 苹果7P', '二手手机 金色 128G 全网通', 47, '/goods-img/5a170339-acb4-4890-bd08-bb109864e853.jpg', '/goods-img/5a170339-acb4-4890-bd08-bb109864e853.jpg', '

商品介绍加载中...

', 2739, 2399, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10352, '【二手9成新】苹果7Plus手机 Apple iPhone7Plus 苹果7P', '二手手机 银色 128G 全网通', 47, '/goods-img/a419ebb4-18a5-4295-9404-0593dd215ad0.jpg', '/goods-img/a419ebb4-18a5-4295-9404-0593dd215ad0.jpg', '

商品介绍加载中...

', 2699, 2466, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10353, '【二手9成新】Apple iPhone X 苹果X', '二手手机 全网通 深空灰 64G', 47, '/goods-img/4f666eee-c2c7-459c-934e-b32714d1e1c4.png', '/goods-img/4f666eee-c2c7-459c-934e-b32714d1e1c4.png', '

商品介绍加载中...

', 5188, 3956, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10354, '【二手9成新】苹果8Plus手机 Apple iPhone 8Plus', '苹果8P 二手手机 深空灰 64G 全网通', 47, '/goods-img/ada8e547-dca3-47fc-8aab-35884575090a.jpg', '/goods-img/ada8e547-dca3-47fc-8aab-35884575090a.jpg', '

商品介绍加载中...

', 3888, 3199, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10355, '【二手9成新】苹果8Plus手机 Apple iPhone 8Plus', '苹果8P 二手手机 金色 64G 全网通', 47, '/goods-img/76a2e417-2f15-412f-ab73-3a5eb2a7d2d1.jpg', '/goods-img/76a2e417-2f15-412f-ab73-3a5eb2a7d2d1.jpg', '

商品介绍加载中...

', 3550, 3199, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10356, '【二手9成新】苹果8Plus手机 Apple iPhone 8Plus', '苹果8P 二手手机 银色 64G 全网通', 47, '/goods-img/5bfb8955-0b1c-4652-b162-a9b91b71211a.jpg', '/goods-img/5bfb8955-0b1c-4652-b162-a9b91b71211a.jpg', '

商品介绍加载中...

', 3499, 3238, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10357, '【二手9成新】苹果8Plus手机 Apple iPhone 8Plus', '苹果8P 二手手机 中国红 64G 全网通', 47, '/goods-img/d31193ee-04c1-4bac-8a91-1a4690a396be.jpg', '/goods-img/d31193ee-04c1-4bac-8a91-1a4690a396be.jpg', '

商品介绍加载中...

', 3438, 3299, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10358, '【二手9成新】Apple iPhoneX 苹果X 二手苹果x手机', '深空灰 64G全网通', 47, '/goods-img/b9264842-cd50-4d6f-a4a5-e8cc9dd483a4.png', '/goods-img/b9264842-cd50-4d6f-a4a5-e8cc9dd483a4.png', '

商品介绍加载中...

', 4799, 3989, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10359, '【二手9成新】Apple iPhoneX 苹果X 二手苹果x手机', '银色 64G全网通', 47, '/goods-img/58e9a125-61c1-416b-b17f-99cda431a202.png', '/goods-img/58e9a125-61c1-416b-b17f-99cda431a202.png', '

商品介绍加载中...

', 4799, 4016, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10360, '【二手95新】Apple iPhone XS 苹果xs', '国行全网通二手手机 银色 全网通 64G', 47, '/goods-img/5a732ada-1fdb-48f1-b106-666159565a94.jpg', '/goods-img/5a732ada-1fdb-48f1-b106-666159565a94.jpg', '

商品介绍加载中...

', 9999, 5299, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10361, '【二手95新】Apple iPhone XS 苹果xs', '国行全网通二手手机 金色 全网通 256G', 47, '/goods-img/f9e9b321-4b25-40c5-af6d-d9f3fe74a053.jpg', '/goods-img/f9e9b321-4b25-40c5-af6d-d9f3fe74a053.jpg', '

商品介绍加载中...

', 9999, 6008, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10362, '【二手9成新】Apple iPhone X 苹果x', '二手手机 X 银色 256G 全网通', 47, '/goods-img/8da60128-fcc7-46ed-98b6-0066c69624c0.png', '/goods-img/8da60128-fcc7-46ed-98b6-0066c69624c0.png', '

商品介绍加载中...

', 5058, 4639, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10363, '【二手9成新】Apple iPhone X 苹果x', '国行全网通二手手机 X 灰色 64G 全网通', 47, '/goods-img/8aca87a3-65dd-4c42-91c7-bbbd10fcf7a6.jpg', '/goods-img/8aca87a3-65dd-4c42-91c7-bbbd10fcf7a6.jpg', '

商品介绍加载中...

', 6999, 3999, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10364, '【二手9成新】Apple iPhone X 苹果x', '国行全网通二手手机 X 银色 64G 全网通', 47, '/goods-img/fdec1b37-9a2f-46ea-af03-5091d83e546a.jpg', '/goods-img/fdec1b37-9a2f-46ea-af03-5091d83e546a.jpg', '

商品介绍加载中...

', 6999, 4078, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10365, '【二手9成新】Apple iPhone XR 苹果xr', '二手手机双卡双待 白色 128G 全网通', 47, '/goods-img/9834bb8d-fe1c-4218-a624-4a25aecb0676.jpg', '/goods-img/9834bb8d-fe1c-4218-a624-4a25aecb0676.jpg', '

商品介绍加载中...

', 5888, 4299, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10366, '【二手9成新】Apple iPhone XR 苹果xr', '二手手机双卡双待 蓝色 128G 全网通', 47, '/goods-img/3993feaa-0365-4d7e-9cc5-dcf583243ca3.jpg', '/goods-img/3993feaa-0365-4d7e-9cc5-dcf583243ca3.jpg', '

商品介绍加载中...

', 5888, 4399, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10367, '【二手9成新】Apple iPhone XR 苹果xr', '二手手机双卡双待 黑色 64G 全网通', 47, '/goods-img/ba9cf789-60a8-48db-8329-97c3fc13a061.jpg', '/goods-img/ba9cf789-60a8-48db-8329-97c3fc13a061.jpg', '

商品介绍加载中...

', 5888, 4055, 10000, '', 0, 0, '2019-09-18 13:27:13', 0, '2019-09-18 13:27:13'), (10689, '荣耀Play3 6.39英寸魅眼全视屏 4000mAh大电池 真4800万AI三摄', '麒麟710F自研芯片 全网通4GB+64GB 幻夜黑', 45, '/goods-img/9aa34959-cd60-418f-b42e-aa7243b6869c.jpg', '/goods-img/9aa34959-cd60-418f-b42e-aa7243b6869c.jpg', '详情加载中...', 999, 999, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10690, '华为 HUAWEI 畅享10 Plus', '超高清全视屏前置悬浮式镜头4800万超广角AI三摄 4GB+128GB幻夜黑全网通双4G手机', 46, '/goods-img/2613a582-460c-4c2b-bbc0-6c7dbf501bd2.jpg', '/goods-img/2613a582-460c-4c2b-bbc0-6c7dbf501bd2.jpg', '详情加载中...', 1499, 1499, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10691, '华为 HUAWEI 畅享10 Plus', '超高清全视屏前置悬浮式镜头4800万超广角AI三摄 4GB+128GB翡冷翠全网通双4G手机', 46, '/goods-img/21b0751b-f6ae-4a57-8fb8-61e007395c43.jpg', '/goods-img/21b0751b-f6ae-4a57-8fb8-61e007395c43.jpg', '

商品介绍加载中...

', 1499, 1499, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10692, '华为 HUAWEI 畅享10 Plus', '超高清全视屏前置悬浮式镜头4800万超广角AI三摄 6GB+128GB天空之境全网通双4G手机', 46, '/goods-img/3f68538f-3b56-4e98-9676-99139857428c.jpg', '/goods-img/3f68538f-3b56-4e98-9676-99139857428c.jpg', '详情加载中...', 1799, 1799, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10693, '荣耀10青春版 幻彩渐变 2400万AI自拍 全网通版4GB+64GB', '渐变蓝 移动联通电信4G全面屏手机 双卡双待', 45, '/goods-img/f8ab28c3-8e04-49a0-ba05-2e6a3ae7211f.jpg', '/goods-img/f8ab28c3-8e04-49a0-ba05-2e6a3ae7211f.jpg', '详情加载中...', 1099, 999, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10694, '荣耀10青春版 幻彩渐变 2400万AI自拍 全网通版4GB+64GB', '幻夜黑 移动联通电信4G全面屏手机 双卡双待', 45, '/goods-img/de654f42-d58d-4336-8edd-da01c3523449.jpg', '/goods-img/de654f42-d58d-4336-8edd-da01c3523449.jpg', '详情加载中...', 1099, 999, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10695, '荣耀10青春版 幻彩渐变 2400万AI自拍 全网通版4GB+64GB', '渐变红 移动联通电信4G全面屏手机 双卡双待', 45, '/goods-img/87254a42-9fdf-4e68-a11e-e8e2eef28d2c.jpg', '/goods-img/87254a42-9fdf-4e68-a11e-e8e2eef28d2c.jpg', '详情加载中...', 1099, 999, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10696, '荣耀10青春版 幻彩渐变 2400万AI自拍 全网通版4GB+64GB', '铃兰白 移动联通电信4G全面屏手机 双卡双待', 45, '/goods-img/81b7060a-7274-4bff-86c0-72d5fc7ff383.jpg', '/goods-img/81b7060a-7274-4bff-86c0-72d5fc7ff383.jpg', '详情加载中...', 1099, 999, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10697, '荣耀8X 千元屏霸 91%屏占比 2000万AI双摄', '4GB+64GB 幻夜黑 移动联通电信4G全面屏手机 双卡双待', 45, '/goods-img/d7f74e8f-5c52-422b-ac99-a8d691830494.jpg', '/goods-img/d7f74e8f-5c52-422b-ac99-a8d691830494.jpg', '详情加载中...', 1399, 999, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10698, '荣耀8X 千元屏霸 91%屏占比 2000万AI双摄', '4GB+64GB 幻影蓝 移动联通电信4G全面屏手机 双卡双待', 45, '/goods-img/7031c07e-a70f-4f6d-9e2d-d0af31e3393a.jpg', '/goods-img/7031c07e-a70f-4f6d-9e2d-d0af31e3393a.jpg', '详情加载中...', 1399, 999, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10699, '荣耀8X 千元屏霸 91%屏占比 2000万AI双摄', '4GB+64GB 魅海蓝 移动联通电信4G全面屏手机 双卡双待', 45, '/goods-img/b7bfcc28-98c2-4cb4-8ce3-afe4c482b674.jpg', '/goods-img/b7bfcc28-98c2-4cb4-8ce3-afe4c482b674.jpg', '详情加载中...', 1399, 999, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10700, '荣耀8X 千元屏霸 91%屏占比 2000万AI双摄', '4GB+64GB 魅焰红 移动联通电信4G全面屏手机 双卡双待', 45, '/goods-img/6a160b96-9b4a-4844-b335-feb31b1f5d8c.jpg', '/goods-img/6a160b96-9b4a-4844-b335-feb31b1f5d8c.jpg', '详情加载中...', 1399, 999, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10701, '荣耀8X 千元屏霸 91%屏占比 2000万AI双摄', '4GB+64GB 梦幻紫 移动联通电信4G全面屏手机 双卡双待', 45, '/goods-img/8ccc13ec-96fe-4488-a604-526601548c9e.jpg', '/goods-img/8ccc13ec-96fe-4488-a604-526601548c9e.jpg', '详情加载中...', 1399, 999, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10702, '华为 HUAWEI P30 超感光徕卡三摄麒麟980AI智能芯片全面屏屏内指纹版手机8GB+128GB天空之境全网通双4G手机', '新蜂精选', 46, '/goods-img/edb7e8ef-7785-418b-a75e-dfed2aa74e39.jpg', '/goods-img/edb7e8ef-7785-418b-a75e-dfed2aa74e39.jpg', '详情加载中...', 4288, 3988, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10703, '华为 HUAWEI P30 超感光徕卡三摄麒麟980AI智能芯片全面屏屏内指纹版手机8GB+128GB亮黑色全网通双4G手机', '新蜂精选', 46, '/goods-img/e13294f7-9ab0-42dc-afb1-9f41c59436cf.jpg', '/goods-img/e13294f7-9ab0-42dc-afb1-9f41c59436cf.jpg', '

商品介绍加载中...

', 4288, 3988, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10704, '华为 HUAWEI P30 超感光徕卡三摄麒麟980AI智能芯片全面屏屏内指纹版手机8GB+128GB珠光贝母全网通双4G手机', '新蜂精选', 46, '/goods-img/b9e6d770-06dd-40f4-9ae5-31103cec6e5f.jpg', '/goods-img/b9e6d770-06dd-40f4-9ae5-31103cec6e5f.jpg', '详情加载中...', 4288, 3988, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10705, '华为 HUAWEI P30 超感光徕卡三摄麒麟980AI智能芯片全面屏屏内指纹版手机8GB+128GB极光色全网通双4G手机', '新蜂精选', 46, '/goods-img/20312f4e-da4f-49b9-8150-ab54f0302915.jpg', '/goods-img/20312f4e-da4f-49b9-8150-ab54f0302915.jpg', '

商品介绍加载中...

', 4288, 3988, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10706, '华为 HUAWEI P30 超感光徕卡三摄麒麟980AI智能芯片全面屏屏内指纹版手机8GB+128GB赤茶橘全网通双4G手机', '新蜂精选', 46, '/goods-img/192b1727-bcab-4bdf-8494-182f8ec5b2e6.jpg', '/goods-img/192b1727-bcab-4bdf-8494-182f8ec5b2e6.jpg', '

商品介绍加载中...

', 4288, 3988, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10707, '荣耀20i 3200万AI自拍 超广角三摄 全网通版6GB+64GB', '渐变蓝 移动联通电信4G全面屏手机 双卡双待', 45, '/goods-img/74146e03-42d1-453c-843d-b02d8bcc24f4.jpg', '/goods-img/74146e03-42d1-453c-843d-b02d8bcc24f4.jpg', '详情加载中...', 1399, 1299, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10708, '荣耀20i 3200万AI自拍 超广角三摄 全网通版6GB+64GB', '渐变红 移动联通电信4G全面屏手机 双卡双待', 45, '/goods-img/4c066fc2-3a58-44df-9dc6-8465b25f92ef.jpg', '/goods-img/4c066fc2-3a58-44df-9dc6-8465b25f92ef.jpg', '详情加载中...', 1399, 1299, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10709, '荣耀20i 3200万AI自拍 超广角三摄 全网通版6GB+64GB', '幻夜黑 移动联通电信4G全面屏手机 双卡双待', 45, '/goods-img/525bdd6e-848b-4e02-b19f-1a08fdb87faa.jpg', '/goods-img/525bdd6e-848b-4e02-b19f-1a08fdb87faa.jpg', '详情加载中...', 1399, 1299, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10710, '荣耀9X 麒麟810 4000mAh超强续航 4800万超清夜拍', '6.59英寸升降全面屏 全网通6GB+64GB 魅海蓝', 45, '/goods-img/7b8b7da7-f154-453e-a6a6-ea2f5e7d8b4a.jpg', '/goods-img/7b8b7da7-f154-453e-a6a6-ea2f5e7d8b4a.jpg', '详情加载中...', 1599, 1599, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10711, '荣耀9X 麒麟810 4000mAh超强续航 4800万超清夜拍', '6.59英寸升降全面屏 全网通6GB+64GB 幻夜黑', 45, '/goods-img/d30f7986-bc0f-4ea8-8fbb-94c6bae248f5.jpg', '/goods-img/d30f7986-bc0f-4ea8-8fbb-94c6bae248f5.jpg', '详情加载中...', 1599, 1599, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10712, '荣耀9X 麒麟810 4000mAh超强续航 4800万超清夜拍', '6.59英寸升降全面屏 全网通4GB+64GB 魅焰红', 45, '/goods-img/95b5df3b-cfec-40bb-8ead-35e0fe7fb7b2.jpg', '/goods-img/95b5df3b-cfec-40bb-8ead-35e0fe7fb7b2.jpg', '详情加载中...', 1399, 1399, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10713, '荣耀20 李现同款 4800万超广角AI四摄 3200W美颜自拍', '麒麟Kirin980全网通版8GB+128GB 蓝水翡翠 全面屏手机', 45, '/goods-img/2469b8fa-8117-4409-a8d6-3b52a33b3e51.jpg', '/goods-img/2469b8fa-8117-4409-a8d6-3b52a33b3e51.jpg', '详情加载中...', 2699, 2499, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10714, '荣耀20 李现同款 4800万超广角AI四摄 3200W美颜自拍', '麒麟Kirin980全网通版8GB+128GB 幻夜黑 全面屏手机', 45, '/goods-img/474e2ef0-2321-4363-ab31-7a838546f172.jpg', '/goods-img/474e2ef0-2321-4363-ab31-7a838546f172.jpg', '详情加载中...', 2699, 2499, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10715, '荣耀20 李现同款 4800万超广角AI四摄 3200W美颜自拍', '麒麟Kirin980全网通版8GB+128GB 冰岛白 全面屏手机', 45, '/goods-img/77d87d20-4fc7-441c-82a8-baf9089fc3ad.jpg', '/goods-img/77d87d20-4fc7-441c-82a8-baf9089fc3ad.jpg', '详情加载中...', 2699, 2499, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10716, '荣耀20 李现同款 4800万超广角AI四摄 3200W美颜自拍', '麒麟Kirin980全网通版8GB+128GB 幻影蓝 全面屏手机', 45, '/goods-img/1a200710-8c41-4411-8edf-a49575807a08.jpg', '/goods-img/1a200710-8c41-4411-8edf-a49575807a08.jpg', '详情加载中...', 2699, 2499, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10717, '荣耀20 PRO 李现同款 4800万全焦段AI四摄', '双光学防抖 麒麟980 全网通4G 8GB+128GB 冰岛幻境 拍照手机', 45, '/goods-img/391cd4e6-6071-41ea-a6fc-d983b30a5470.jpg', '/goods-img/391cd4e6-6071-41ea-a6fc-d983b30a5470.jpg', '详情加载中...', 3199, 2899, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10718, '荣耀20 PRO 李现同款 4800万全焦段AI四摄', '双光学防抖 麒麟980 全网通4G 8GB+128GB 蓝水翡翠 拍照手机', 45, '/goods-img/5d7ee18f-ca20-4d72-a803-dc5b03bd80e2.jpg', '/goods-img/5d7ee18f-ca20-4d72-a803-dc5b03bd80e2.jpg', '详情加载中...', 3199, 2899, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10719, '荣耀20 PRO 李现同款 4800万全焦段AI四摄', '双光学防抖 麒麟980 全网通4G 8GB+128GB 幻夜星河 拍照手机', 45, '/goods-img/e1505375-d00d-4cd8-a090-a13490b430d5.jpg', '/goods-img/e1505375-d00d-4cd8-a090-a13490b430d5.jpg', '详情加载中...', 3199, 2899, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10720, '荣耀20 PRO × MOSCHINO联名版', '4800万全焦段AI四摄 双光学防抖 麒麟980 8GB+256GB 黑色', 45, '/goods-img/0ae89667-8a69-4efc-b8d8-c0ebaf56753a.jpg', '/goods-img/0ae89667-8a69-4efc-b8d8-c0ebaf56753a.jpg', '详情加载中...', 3799, 3799, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10721, '华为 HUAWEI 畅享 9S', '6GB+64GB 幻夜黑 全网通 2400万超广角三摄珍珠屏大存储 移动联通电信4G手机 双卡双待', 46, '/goods-img/1b96ae9b-8c56-465e-9e82-ff712305e2d9.jpg', '/goods-img/1b96ae9b-8c56-465e-9e82-ff712305e2d9.jpg', '详情加载中...', 1499, 1199, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10722, '华为 HUAWEI 畅享 9S', '6GB+64GB 极光蓝 全网通 2400万超广角三摄珍珠屏大存储 移动联通电信4G手机 双卡双待', 46, '/goods-img/b49530f5-fe13-42b3-9ca9-6f1367e0f8f8.jpg', '/goods-img/b49530f5-fe13-42b3-9ca9-6f1367e0f8f8.jpg', '详情加载中...', 1499, 1199, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10723, '华为 HUAWEI 畅享 9S', '6GB+64GB 珊瑚红 全网通 2400万超广角三摄珍珠屏大存储 移动联通电信4G手机 双卡双待', 46, '/goods-img/84397a4c-ff06-4f08-bad5-bd4d5f8e23ff.jpg', '/goods-img/84397a4c-ff06-4f08-bad5-bd4d5f8e23ff.jpg', '详情加载中...', 1499, 1199, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10724, '荣耀V20 游戏手机 麒麟980芯片 魅眼全视屏', '4800万深感相机 6GB+128GB 幻夜黑 移动联通电信4G全面屏手机', 45, '/goods-img/7a58b5b2-0101-4a55-9872-d7765f08cf19.jpg', '/goods-img/7a58b5b2-0101-4a55-9872-d7765f08cf19.jpg', '详情加载中...', 2199, 2099, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10725, '荣耀V20 游戏手机 麒麟980芯片 魅眼全视屏', '4800万深感相机 6GB+128GB 魅海蓝 移动联通电信4G全面屏手机', 45, '/goods-img/5dd6b4de-0b39-48fc-9285-7356c22edf7b.jpg', '/goods-img/5dd6b4de-0b39-48fc-9285-7356c22edf7b.jpg', '详情加载中...', 2199, 2099, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10726, '荣耀V20 游戏手机 麒麟980芯片 魅眼全视屏', '4800万深感相机 6GB+128GB 幻影蓝 移动联通电信4G全面屏手机', 45, '/goods-img/c5a6593b-ef49-42fd-b330-0be8021362d8.jpg', '/goods-img/c5a6593b-ef49-42fd-b330-0be8021362d8.jpg', '详情加载中...', 2199, 2099, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10727, '荣耀V20 游戏手机 麒麟980芯片 魅眼全视屏', '4800万深感相机 6GB+128GB 魅丽红 移动联通电信4G全面屏手机', 45, '/goods-img/b57f705a-ef7f-4a9f-a244-3fc980e17555.jpg', '/goods-img/b57f705a-ef7f-4a9f-a244-3fc980e17555.jpg', '详情加载中...', 2199, 2099, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10728, '荣耀V20 游戏手机 麒麟980芯片 魅眼全视屏', '4800万深感相机 6GB+128GB 幻影红 移动联通电信4G全面屏手机', 45, '/goods-img/3dd91f7d-8f89-4e8a-a808-fa556ee1ceb3.jpg', '/goods-img/3dd91f7d-8f89-4e8a-a808-fa556ee1ceb3.jpg', '详情加载中...', 2199, 2099, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10729, '华为 HUAWEI P20 AI智慧徕卡双摄全面屏游戏手机', '6GB+128GB 亮黑色 全网通移动联通电信4G手机 双卡双待', 46, '/goods-img/f8edc81a-8fbd-425b-8ed7-d6b4c14ec6a1.jpg', '/goods-img/f8edc81a-8fbd-425b-8ed7-d6b4c14ec6a1.jpg', '

商品介绍加载中...

', 3088, 2799, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10730, '华为 HUAWEI P20 AI智慧徕卡双摄全面屏游戏手机', '6GB+64GB 极光色 全网通移动联通电信4G手机 双卡双待', 46, '/goods-img/c17c5292-2c20-4196-88e3-7ea813530db5.jpg', '/goods-img/c17c5292-2c20-4196-88e3-7ea813530db5.jpg', '

商品介绍加载中...

', 2788, 2679, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10731, '华为 HUAWEI P20 AI智慧徕卡双摄全面屏游戏手机', '6GB+64GB 宝石蓝 全网通移动联通电信4G手机 双卡双待', 46, '/goods-img/b43bcd55-3709-4c32-b3a2-5b59c80f3610.jpg', '/goods-img/b43bcd55-3709-4c32-b3a2-5b59c80f3610.jpg', '

商品介绍加载中...

', 2788, 2699, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10732, '华为 HUAWEI P20 AI智慧全面屏', '6GB+64GB 极光闪蝶色 全网通版 移动联通电信4G手机 双卡双待', 46, '/goods-img/3b183d9a-ac01-4bed-a7bb-1ddeba6ad416.jpg', '/goods-img/3b183d9a-ac01-4bed-a7bb-1ddeba6ad416.jpg', '详情加载中...', 2788, 2679, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10733, '华为 HUAWEI P20 AI智慧全面屏', '6GB+64GB 珠光贝母色 全网通版 移动联通电信4G手机 双卡双待', 46, '/goods-img/28e94d5d-9ccc-4843-a296-2747530037ce.jpg', '/goods-img/28e94d5d-9ccc-4843-a296-2747530037ce.jpg', '详情加载中...', 3388, 2988, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10734, '华为 HUAWEI P20 AI智慧徕卡双摄全面屏游戏手机', '6GB+128GB 香槟金 全网通移动联通电信4G手机 双卡双待', 46, '/goods-img/0b11241e-4d6b-44ea-afb0-e029d1b5a54d.jpg', '/goods-img/0b11241e-4d6b-44ea-afb0-e029d1b5a54d.jpg', '

商品介绍加载中...

', 3888, 3888, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10735, '荣耀20S 李现同款 3200万人像超级夜景 4800万超广角AI三摄', '麒麟810旗舰级芯片 全网通版6GB+128GB 蝶羽蓝', 45, '/goods-img/8883043d-bef3-442c-9ccf-af9c03510c5d.jpg', '/goods-img/8883043d-bef3-442c-9ccf-af9c03510c5d.jpg', '详情加载中...', 1899, 1899, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10736, '华为 HUAWEI 畅享MAX 4GB+64GB', '幻夜黑 全网通版 珍珠屏杜比全景声大电池 移动联通电信4G手机 双卡双待', 46, '/goods-img/522ed5b9-bcae-401f-9933-d2e957bb3384.jpg', '/goods-img/522ed5b9-bcae-401f-9933-d2e957bb3384.jpg', '

商品介绍加载中...

', 1199, 999, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10737, '华为 HUAWEI 畅享MAX 4GB+64GB', '琥珀棕 全网通版 珍珠屏杜比全景声大电池 移动联通电信4G手机 双卡双待', 46, '/goods-img/36bdfdb9-21b1-46d5-9534-8b3873c9b6d9.jpg', '/goods-img/36bdfdb9-21b1-46d5-9534-8b3873c9b6d9.jpg', '

商品介绍加载中...

', 1199, 999, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10738, '华为 HUAWEI 畅享MAX 4GB+128GB', '天际白 全网通版 珍珠屏杜比全景声大电池 移动联通电信4G手机 双卡双待', 46, '/goods-img/51fa04cf-1c05-49ee-8dea-0c1757ff32c4.jpg', '/goods-img/51fa04cf-1c05-49ee-8dea-0c1757ff32c4.jpg', '

商品介绍加载中...

', 1899, 1399, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10739, '华为 HUAWEI P30 Pro', '超感光徕卡四摄10倍混合变焦麒麟980芯片屏内指纹 8GB+128GB极光色全网通版双4G手机', 46, '/goods-img/65c8e729-aeca-4780-977b-4d0d39d4aa2e.jpg', '/goods-img/65c8e729-aeca-4780-977b-4d0d39d4aa2e.jpg', '

商品介绍加载中...

', 5488, 4988, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10740, '华为 HUAWEI P30 Pro', '超感光徕卡四摄10倍混合变焦麒麟980芯片屏内指纹 8GB+128GB亮黑色全网通版双4G手机', 46, '/goods-img/bc90bb1e-494a-44d4-b180-42a994ec80fc.jpg', '/goods-img/bc90bb1e-494a-44d4-b180-42a994ec80fc.jpg', '

商品介绍加载中...

', 5488, 4988, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10741, '华为 HUAWEI P30 Pro', '超感光徕卡四摄10倍混合变焦麒麟980芯片屏内指纹 8GB+128GB珠光贝母全网通版双4G手机', 46, '/goods-img/a6f309b7-765a-4407-be71-bbd5b764d448.jpg', '/goods-img/a6f309b7-765a-4407-be71-bbd5b764d448.jpg', '

商品介绍加载中...

', 5488, 4988, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10742, '华为 HUAWEI P30 Pro', '超感光徕卡四摄10倍混合变焦麒麟980芯片屏内指纹 8GB+256GB天空之境全网通版双4G手机', 46, '/goods-img/dda1d575-cdac-4eb4-a118-3834490166f7.jpg', '/goods-img/dda1d575-cdac-4eb4-a118-3834490166f7.jpg', '

商品介绍加载中...

', 5988, 5488, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10743, '华为 HUAWEI P30 Pro', '超感光徕卡四摄10倍混合变焦麒麟980芯片屏内指纹 8GB+256GB墨玉蓝全网通版双4G手机', 46, '/goods-img/8755a735-baa1-4f17-a9bd-30c4f4f1451b.jpg', '/goods-img/8755a735-baa1-4f17-a9bd-30c4f4f1451b.jpg', '详情加载中...', 5988, 5488, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10744, '华为 HUAWEI P30 Pro', '超感光徕卡四摄10倍混合变焦麒麟980芯片屏内指纹 8GB+128GB赤茶橘全网通版双4G手机', 46, '/goods-img/44e78820-86f3-429d-94af-64f6af308846.jpg', '/goods-img/44e78820-86f3-429d-94af-64f6af308846.jpg', '

商品介绍加载中...

', 5488, 4988, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10745, '华为 HUAWEI P30 Pro', '超感光徕卡四摄10倍混合变焦麒麟980芯片屏内指纹 8GB+128GB嫣紫色全网通版双4G手机', 46, '/goods-img/no-img.png', '/goods-img/no-img.png', '详情加载中...', 5488, 4988, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10746, '华为 HUAWEI nova 5', 'Pro 前置3200万人像超级夜景4800万AI四摄麒麟980芯片8GB+128GB绮境森林全网通双4G手机', 46, '/goods-img/2948815e-043a-4f47-896f-7f6ccf916369.jpg', '/goods-img/2948815e-043a-4f47-896f-7f6ccf916369.jpg', '详情加载中...', 2999, 2999, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10747, '华为 HUAWEI nova 5', 'Pro 前置3200万人像超级夜景4800万AI四摄麒麟980芯片8GB+128GB亮黑色全网通双4G手机', 46, '/goods-img/df1bea42-9172-4cd5-9fc5-f35bb736108f.jpg', '/goods-img/df1bea42-9172-4cd5-9fc5-f35bb736108f.jpg', '详情加载中...', 2999, 2999, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10748, '华为 HUAWEI nova 5', 'Pro 前置3200万人像超级夜景4800万AI四摄麒麟980芯片 8GB+128GB仲夏紫全网通双4G手机', 46, '/goods-img/ab6f8463-794f-4f40-87b8-d01e6260ff1c.jpg', '/goods-img/ab6f8463-794f-4f40-87b8-d01e6260ff1c.jpg', '详情加载中...', 2999, 2999, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10749, '华为 HUAWEI nova 5', 'Pro 前置3200万人像超级夜景4800万AI四摄麒麟980芯片8GB+128GB苏音蓝全网通双4G手机', 46, '/goods-img/98e90b6e-2a5d-462d-8cd1-44699144a0b5.jpg', '/goods-img/98e90b6e-2a5d-462d-8cd1-44699144a0b5.jpg', '详情加载中...', 2999, 2999, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10750, '华为 HUAWEI nova 5', 'Pro 前置3200万人像超级夜景4800万AI四摄麒麟980芯片8GB+128GB珊瑚橙全网通双4G手机', 46, '/goods-img/ec0bafed-d651-4be7-b2aa-13e84248219a.jpg', '/goods-img/ec0bafed-d651-4be7-b2aa-13e84248219a.jpg', '详情加载中...', 2999, 2999, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10751, '华为 HUAWEI nova 5', 'Pro 前置3200万人像超级夜景4800万AI四摄麒麟980芯片8GB+256GB仲夏紫星耀礼盒版全网通', 46, '/goods-img/83f39052-5a1c-4769-a7db-cf2bd53d2a29.jpg', '/goods-img/83f39052-5a1c-4769-a7db-cf2bd53d2a29.jpg', '详情加载中...', 3799, 3599, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10752, '华为 HUAWEI nova 5i', '后置AI四摄 极点全面屏 前置2400万高清摄像头 8GB+128GB 苏音蓝 全网通双卡双待', 46, '/goods-img/4b2bffff-ec0b-42e0-8152-ada9a121ad31.jpg', '/goods-img/4b2bffff-ec0b-42e0-8152-ada9a121ad31.jpg', '

商品介绍加载中...

', 2199, 2199, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10753, '华为 HUAWEI nova 5i', '后置AI四摄 极点全面屏 前置2400万高清摄像头 8GB+128GB 幻夜黑 全网通双卡双待', 46, '/goods-img/04dce482-ff0e-483c-b324-dfc030b6cdd1.jpg', '/goods-img/04dce482-ff0e-483c-b324-dfc030b6cdd1.jpg', '

商品介绍加载中...

', 2199, 2199, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10754, '华为 HUAWEI nova 5i', '后置AI四摄 极点全面屏 前置2400万高清摄像头 8GB+128GB 蜜语红 全网通双卡双待', 46, '/goods-img/b5e139d3-ea6b-4874-9ccc-c18aca44a8bc.jpg', '/goods-img/b5e139d3-ea6b-4874-9ccc-c18aca44a8bc.jpg', '

商品介绍加载中...

', 2199, 2199, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10755, '荣耀9X PRO 麒麟810液冷散热 4000mAh超强续航', '4800万超广角夜拍三摄 6.59英寸全网通8GB+128GB 幻影紫', 45, '/goods-img/86bd80cd-140b-474c-8277-3747332f61b3.jpg', '/goods-img/86bd80cd-140b-474c-8277-3747332f61b3.jpg', '详情加载中...', 2199, 2199, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10756, '荣耀9X PRO 麒麟810液冷散热 4000mAh超强续航', '4800万超广角夜拍三摄 6.59英寸全网通8GB+128GB 幻夜黑', 45, '/goods-img/3b008be9-e906-4364-8aa0-0df2e670dbd2.jpg', '/goods-img/3b008be9-e906-4364-8aa0-0df2e670dbd2.jpg', '详情加载中...', 2199, 2199, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10757, '荣耀畅玩8C两天一充 莱茵护眼 刘海屏 全网通版4GB+32GB', '极光蓝 移动联通电信4G全面屏手机 双卡双待', 45, '/goods-img/7f7d2343-6743-490b-baec-3e0a76d061e5.jpg', '/goods-img/7f7d2343-6743-490b-baec-3e0a76d061e5.jpg', '详情加载中...', 899, 799, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10758, '荣耀畅玩8C两天一充 莱茵护眼 刘海屏 全网通版4GB+32GB', '铂光金 移动联通电信4G全面屏手机 双卡双待', 45, '/goods-img/b163ca1b-7deb-4b15-818a-dc765c852305.jpg', '/goods-img/b163ca1b-7deb-4b15-818a-dc765c852305.jpg', '详情加载中...', 899, 799, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10759, '荣耀畅玩8C两天一充 莱茵护眼 刘海屏 全网通版4GB+32GB', '星云紫 移动联通电信4G全面屏手机 双卡双待', 45, '/goods-img/f949289a-4c51-4159-a754-871da347e1e5.jpg', '/goods-img/f949289a-4c51-4159-a754-871da347e1e5.jpg', '详情加载中...', 899, 799, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10760, '荣耀畅玩8C两天一充 莱茵护眼 刘海屏 全网通版4GB+64GB', '幻夜黑 移动联通电信4G全面屏手机 双卡双待', 45, '/goods-img/27c3c018-95c5-429f-9ad7-be0fedd78329.jpg', '/goods-img/27c3c018-95c5-429f-9ad7-be0fedd78329.jpg', '详情加载中...', 1399, 1099, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10761, '荣耀畅玩8C两天一充 莱茵护眼 刘海屏 全网通版4GB+64GB', '幻影蓝 移动联通电信4G全面屏手机 双卡双待', 45, '/goods-img/61224f59-e11a-4005-84dc-cadfdd4162f6.jpg', '/goods-img/61224f59-e11a-4005-84dc-cadfdd4162f6.jpg', '详情加载中...', 1399, 1099, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10762, '华为 HUAWEI 畅享8e 青春版', '2GB+32GB全面屏 金色 全网通版 移动联通电信4G手机 双卡双待', 46, '/goods-img/af23223e-56fa-4aa7-b832-c55c713fa604.jpg', '/goods-img/af23223e-56fa-4aa7-b832-c55c713fa604.jpg', '

商品介绍加载中...

', 699, 549, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10763, '华为 HUAWEI 畅享8e青春 2GB+32GB全面屏', '黑色 全网通版 移动联通电信4G手机 双卡双待', 46, '/goods-img/bf64e22d-1cd3-40b0-9ce1-cc944e35d2d4.jpg', '/goods-img/bf64e22d-1cd3-40b0-9ce1-cc944e35d2d4.jpg', '

商品介绍加载中...

', 699, 549, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10764, '华为 HUAWEI 畅享8e青春 2GB+32GB全面屏', '蓝色 全网通版 移动联通电信4G手机 双卡双待', 46, '/goods-img/70f9ecf9-4859-45de-8f67-5afbdba6735c.jpg', '/goods-img/70f9ecf9-4859-45de-8f67-5afbdba6735c.jpg', '

商品介绍加载中...

', 699, 549, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10765, '华为 HUAWEI nova 4e', '3200万立体美颜AI超广角三摄珍珠屏6GB+128GB雀翎蓝全网通版双4G手机', 46, '/goods-img/55b997f9-fa22-40b0-8b33-429760c2af49.jpg', '/goods-img/55b997f9-fa22-40b0-8b33-429760c2af49.jpg', '

商品介绍加载中...

', 1999, 1799, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10766, '华为 HUAWEI nova 4e', '3200万立体美颜AI超广角三摄珍珠屏6GB+128GB幻夜黑全网通版双4G手机', 46, '/goods-img/8d675ec6-efe0-4ca6-8f83-193820b07256.jpg', '/goods-img/8d675ec6-efe0-4ca6-8f83-193820b07256.jpg', '

商品介绍加载中...

', 1999, 1799, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10767, '华为 HUAWEI nova 4e', '3200万立体美颜AI超广角三摄珍珠屏6GB+128GB珍珠白全网通版双4G手机', 46, '/goods-img/c8ce9a44-7b40-48b2-91cb-2a1607561b4a.jpg', '/goods-img/c8ce9a44-7b40-48b2-91cb-2a1607561b4a.jpg', '

商品介绍加载中...

', 1999, 1799, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10768, '华为 HUAWEI 畅享9 Plus', '4GB+64GB 极光紫 全网通 四摄超清全面屏大电池 移动联通电信4G手机 双卡双待', 46, '/goods-img/5ea16713-f6ae-4fa7-a53d-1700c29cb3d3.jpg', '/goods-img/5ea16713-f6ae-4fa7-a53d-1700c29cb3d3.jpg', '详情加载中...', 1299, 1199, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10769, '华为 HUAWEI 畅享9 Plus', '4GB+64GB 幻夜黑 全网通 四摄超清全面屏大电池 移动联通电信4G手机 双卡双待', 46, '/goods-img/39e4b0c8-c4c5-4162-8a32-3bb9bb483503.jpg', '/goods-img/39e4b0c8-c4c5-4162-8a32-3bb9bb483503.jpg', '详情加载中...', 1299, 1199, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10770, '华为 HUAWEI 畅享9 Plus', '4GB+64GB 宝石蓝 全网通 四摄超清全面屏大电池 移动联通电信4G手机 双卡双待', 46, '/goods-img/ca2bb115-c75e-475b-93ab-c2436f31aa16.jpg', '/goods-img/ca2bb115-c75e-475b-93ab-c2436f31aa16.jpg', '详情加载中...', 1299, 1199, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10771, '华为 HUAWEI 畅享9 Plus', '4GB+64GB 樱语粉 全网通 四摄超清全面屏大电池 移动联通电信4G手机 双卡双待', 46, '/goods-img/65e953c4-1d29-423a-b7d7-4276c4d42aaa.jpg', '/goods-img/65e953c4-1d29-423a-b7d7-4276c4d42aaa.jpg', '详情加载中...', 1299, 1199, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10772, '华为 HUAWEI nova 3i', '全面屏高清四摄游戏手机4GB+128GB 亮黑色 移动4G+ 移动联通电信4G手机双卡双待', 46, '/goods-img/2252c604-ced3-4e92-b58b-15402ae7be2c.jpg', '/goods-img/2252c604-ced3-4e92-b58b-15402ae7be2c.jpg', '详情加载中...', 1399, 1299, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10773, '华为 HUAWEI nova 3i', '全面屏高清四摄游戏手机4GB+128GB 蓝楹紫 移动4G+ 移动联通电信4G手机双卡双待', 46, '/goods-img/a17dc2b3-17dc-4be7-a04d-12a3fa62de31.jpg', '/goods-img/a17dc2b3-17dc-4be7-a04d-12a3fa62de31.jpg', '详情加载中...', 1399, 1299, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10774, '华为 HUAWEI nova 5i', 'Pro 前置3200万人像超级夜景4800万AI四摄极点全面屏6GB+128GB翡冷翠全网通双4G手机', 46, '/goods-img/e3f32e21-1208-481d-bfcd-8447de78043b.jpg', '/goods-img/e3f32e21-1208-481d-bfcd-8447de78043b.jpg', '

商品介绍加载中...

', 2199, 2149, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10775, '华为 HUAWEI nova 5i', 'Pro 前置3200万人像超级夜景4800万AI四摄极点全面屏6GB+128GB幻夜黑全网通双4G手机', 46, '/goods-img/1eb1e40c-7f38-47ed-a839-d43c1d0b79a8.jpg', '/goods-img/1eb1e40c-7f38-47ed-a839-d43c1d0b79a8.jpg', '详情加载中...', 2199, 2149, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10776, '华为 HUAWEI nova 5i', 'Pro 前置3200万人像超级夜景4800万AI四摄极点全面屏6GB+128GB极光色全网通双4G手机', 46, '/goods-img/80f05e0d-0d06-4aa8-bca5-0d39a2365b4b.jpg', '/goods-img/80f05e0d-0d06-4aa8-bca5-0d39a2365b4b.jpg', '详情加载中...', 2199, 2149, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10777, '华为 HUAWEI Mate 20', '麒麟980AI智能芯片全面屏超微距影像超大广角徕卡三摄6GB+128GB亮黑色全网通版双4G手机', 46, '/goods-img/9024ab8a-be67-4459-8414-8d84225851a7.jpg', '/goods-img/9024ab8a-be67-4459-8414-8d84225851a7.jpg', '

商品介绍加载中...

', 3799, 3699, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10778, '华为 HUAWEI Mate 20', '麒麟980AI智能芯片全面屏超微距影像超大广角徕卡三摄6GB+128GB极光色全网通版双4G手机', 46, '/goods-img/940a6c56-9f7b-4008-8679-c7ef5a44d695.jpg', '/goods-img/940a6c56-9f7b-4008-8679-c7ef5a44d695.jpg', '

商品介绍加载中...

', 3799, 3699, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10779, '华为 HUAWEI Mate 20', '麒麟980AI智能芯片全面屏超微距影像超大广角徕卡三摄6GB+64GB翡冷翠全网通版双4G手机', 46, '/goods-img/08f9a912-f049-4cf8-a839-115fc6582398.jpg', '/goods-img/08f9a912-f049-4cf8-a839-115fc6582398.jpg', '

商品介绍加载中...

', 3299, 3199, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10780, '华为 HUAWEI Mate 20', '麒麟980AI智能芯片全面屏超微距影像超大广角徕卡三摄6GB+128GB宝石蓝全网通版双4G手机', 46, '/goods-img/5d57e0ba-1bc7-45a7-9677-f501e0384442.jpg', '/goods-img/5d57e0ba-1bc7-45a7-9677-f501e0384442.jpg', '

商品介绍加载中...

', 3799, 3699, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10781, '华为 HUAWEI 麦芒 8', '超广角AI三摄 高清珍珠屏 大存储 6GB+128GB 极光蓝 全网通双4G手机', 46, '/goods-img/bde7fc16-fb6b-42b0-8950-13ff287c3cd3.jpg', '/goods-img/bde7fc16-fb6b-42b0-8950-13ff287c3cd3.jpg', '详情加载中...', 1899, 1699, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10782, '华为 HUAWEI 麦芒 8', '超广角AI三摄 高清珍珠屏 大存储 6GB+128GB 幻夜黑 全网通双4G手机', 46, '/goods-img/e299773e-14e4-4168-adab-514f6c6d35ed.jpg', '/goods-img/e299773e-14e4-4168-adab-514f6c6d35ed.jpg', '

商品介绍加载中...

', 1899, 1699, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10783, '华为 HUAWEI 麦芒 8', '超广角AI三摄 高清珍珠屏 大存储 6GB+128GB 宝石蓝 全网通双4G手机', 46, '/goods-img/2a3fb7d2-cb76-47b2-88c6-db0f869b5718.jpg', '/goods-img/2a3fb7d2-cb76-47b2-88c6-db0f869b5718.jpg', '

商品介绍加载中...

', 1899, 1699, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10784, '荣耀8X Max 骁龙660 7.12英寸90%屏占比珍珠屏', '6GB+64GB 魅海蓝 移动联通电信4G全面屏手机 双卡双待', 45, '/goods-img/c0763005-4e67-4861-98f2-e6a550ec4d87.jpg', '/goods-img/c0763005-4e67-4861-98f2-e6a550ec4d87.jpg', '详情加载中...', 1799, 1199, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10785, '荣耀8X Max 骁龙660 7.12英寸90%屏占比珍珠屏', '6GB+64GB 幻夜黑 移动联通电信4G全面屏手机 双卡双待', 45, '/goods-img/aea7760b-d950-4f64-8db9-ef055f15d234.jpg', '/goods-img/aea7760b-d950-4f64-8db9-ef055f15d234.jpg', '详情加载中...', 1799, 1199, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10786, '荣耀8X Max 骁龙660 7.12英寸90%屏占比珍珠屏', '6GB+64GB 魅焰红 移动联通电信4G全面屏手机 双卡双待', 45, '/goods-img/f5e2d2e7-541a-44fa-ad5c-4f15f48ebfc9.jpg', '/goods-img/f5e2d2e7-541a-44fa-ad5c-4f15f48ebfc9.jpg', '详情加载中...', 1799, 1199, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10787, '华为 HUAWEI Mate 10', '4GB+64GB 亮黑色 移动4G+手机 双卡双待', 46, '/goods-img/b67a4ac6-7766-4995-8110-1bd442ec0797.jpg', '/goods-img/b67a4ac6-7766-4995-8110-1bd442ec0797.jpg', '

商品介绍加载中...

', 1799, 1799, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10788, '华为 HUAWEI 畅享9 3GB+32GB', '极光蓝 高清珍珠屏 AI长续航 全网通标配版 移动联通电信4G手机', 46, '/goods-img/bd8b2d93-c251-46b8-9990-77baaf3075f3.jpg', '/goods-img/bd8b2d93-c251-46b8-9990-77baaf3075f3.jpg', '

商品介绍加载中...

', 999, 799, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10789, '华为 HUAWEI 畅享9 3GB+32GB', '幻夜黑 高清珍珠屏 AI长续航 全网通标配版 移动联通电信4G手机', 46, '/goods-img/71ae1ce8-38e8-4da3-8fa1-5e8157a12685.jpg', '/goods-img/71ae1ce8-38e8-4da3-8fa1-5e8157a12685.jpg', '

商品介绍加载中...

', 999, 799, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10790, '华为 HUAWEI 畅享9 4GB+64GB', '极光紫 高清珍珠屏 AI长续航 全网通高配版 移动联通电信4G手机', 46, '/goods-img/371386b8-ddf4-4fc1-985e-ef0e1a076710.jpg', '/goods-img/371386b8-ddf4-4fc1-985e-ef0e1a076710.jpg', '

商品介绍加载中...

', 1099, 1099, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10791, '华为 HUAWEI 畅享9 4GB+64GB', '珊瑚红 高清珍珠屏 AI长续航 全网通高配版 移动联通电信4G手机', 46, '/goods-img/60392ae1-d076-47b5-a00d-b2278e01ccb5.jpg', '/goods-img/60392ae1-d076-47b5-a00d-b2278e01ccb5.jpg', '

商品介绍加载中...

', 1099, 1099, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10792, '荣耀畅玩8A 6.09英寸珍珠全面屏 震撼大音量 3GB+32GB', '幻夜黑 移动联通电信4G全面屏手机 双卡双待', 45, '/goods-img/0a592388-1535-4f9f-8201-ecb78c48bb3d.jpg', '/goods-img/0a592388-1535-4f9f-8201-ecb78c48bb3d.jpg', '详情加载中...', 799, 649, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10793, '荣耀畅玩8A 6.09英寸珍珠全面屏 震撼大音量 3GB+32GB', '极光蓝 移动联通电信4G全面屏手机 双卡双待', 45, '/goods-img/fd218943-8f6f-4fb8-91a4-d6216cc5afdc.jpg', '/goods-img/fd218943-8f6f-4fb8-91a4-d6216cc5afdc.jpg', '详情加载中...', 799, 649, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10794, '荣耀畅玩8A 6.09英寸珍珠全面屏 震撼大音量 3GB+32GB', '魅焰红 移动联通电信4G全面屏手机 双卡双待', 45, '/goods-img/54641753-d8e7-45da-8c6c-81192552cf15.jpg', '/goods-img/54641753-d8e7-45da-8c6c-81192552cf15.jpg', '详情加载中...', 799, 649, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10795, '荣耀畅玩8A 6.09英寸珍珠全面屏 震撼大音量 3GB+32GB', '铂光金 移动联通电信4G全面屏手机 双卡双待', 45, '/goods-img/7b65ad3d-74a4-4322-8653-6bda47a8b4eb.jpg', '/goods-img/7b65ad3d-74a4-4322-8653-6bda47a8b4eb.jpg', '详情加载中...', 799, 649, 10000, '', 0, 0, '2019-09-18 13:37:44', 0, '2019-09-18 13:37:44'), (10796, 'Redmi K20Pro 骁龙855 索尼4800万超广角三摄', 'AMOLED弹出式全面屏 8GB+256GB 碳纤黑 游戏智能手机 小米 红米', 0, '/goods-img/2a05cc6a-3eea-42f9-ab97-2e2529a72099.jpg', '/goods-img/2a05cc6a-3eea-42f9-ab97-2e2529a72099.jpg', '

商品介绍加载中...

', 2999, 2699, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10797, '小米9 Pro 5G 全面屏游戏拍照新品手机', '新蜂精选', 51, '/goods-img/d5fc8bec-0add-48d3-b73b-349a0375e8dc.jpg', '/goods-img/d5fc8bec-0add-48d3-b73b-349a0375e8dc.jpg', '详情加载中...', 9999, 9999, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10798, '【新品抢购】Redmi Note8 4800万全场景四摄 4000mAh长续航', '高通骁龙665 18W快充 小金刚品质保证 4GB+64GB 梦幻蓝 游戏智能手机 小米 红米', 0, '/goods-img/e4e4c543-6d9a-4b19-bedf-3f40024cb710.jpg', '/goods-img/e4e4c543-6d9a-4b19-bedf-3f40024cb710.jpg', '

商品介绍加载中...

', 999, 999, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10799, '【新品抢购】Redmi Note8 4800万全场景四摄 4000mAh长续航', '高通骁龙665 18W快充 小金刚品质保证 4GB+64GB 皓月白 游戏智能手机 小米 红米', 0, '/goods-img/87e0f6ab-45ef-4710-a5f4-e57a470b6b26.jpg', '/goods-img/87e0f6ab-45ef-4710-a5f4-e57a470b6b26.jpg', '详情加载中...', 999, 999, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10800, '【新品抢购】Redmi Note8 4800万全场景四摄 4000mAh长续航', '高通骁龙665 18W快充 小金刚品质保证 4GB+64GB 曜石黑 游戏智能手机 小米 红米', 0, '/goods-img/4a5c5b20-2dd3-4343-a6d1-31195c9edea4.jpg', '/goods-img/4a5c5b20-2dd3-4343-a6d1-31195c9edea4.jpg', '详情加载中...', 999, 999, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10801, 'Redmi Note7 4800万双摄千元机 满血骁龙660', '18个月超长质保 4000mAh超长续航 6GB+64GB 镜花水月 游戏智能手机 小米 红米', 0, '/goods-img/30ef1f51-f958-486f-8d79-f48f6d8293dd.jpg', '/goods-img/30ef1f51-f958-486f-8d79-f48f6d8293dd.jpg', '详情加载中...', 1199, 1099, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10802, 'Redmi Note7 4800万双摄千元机 满血骁龙660', '18个月超长质保 4000mAh超长续航 6GB+64GB 亮黑色 游戏智能手机 小米 红米', 0, '/goods-img/92beacb0-f692-42ff-a20f-8fecd2b0c046.jpg', '/goods-img/92beacb0-f692-42ff-a20f-8fecd2b0c046.jpg', '*相机默认1200w,如何设置4800w? 打开相机 — 右滑切换到“专业”模式 — 点击屏幕左上方的“48MP”,打开4800万超清。 *如何设置全面屏模式? 点击设置 — 点击全面屏 — 进入全面屏设置会出现两个选项,可以选择经典导航也可以选择全面屏手势。选择全面屏手势,可进行手势学习,使用全面屏模式进行操作 *是否支持OTG功能? 支持。 *红米Note7出厂预装版本是Andriod 9.0吗? 该商品首批出厂操作系统:MIUI 10 (Andriod 9.0)。 *有呼吸灯吗?是否支持NFC? 是否支持收音机? 有呼吸灯,不支持NFC,支持收音机。 *4800万模式是否支持AI场景识别,能否有快速切换方式介绍? 4800万模式下不支持AI场景识别,普通相机模式下可支持AI识别。 *是否支持王者荣耀Vulkan 模式? 目前暂不支持王者荣耀Vulkan模式。      Redmi 红米Note 7 常见问题', 1199, 1099, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10803, 'Redmi Note7 4800万双摄千元机 满血骁龙660', '18个月超长质保 4000mAh超长续航 6GB+64GB 暮光金 游戏智能手机 小米 红米', 0, '/goods-img/0cf95c37-2665-4894-bd42-5f8de06c6d94.jpg', '/goods-img/0cf95c37-2665-4894-bd42-5f8de06c6d94.jpg', '*相机默认1200w,如何设置4800w? 打开相机 — 右滑切换到“专业”模式 — 点击屏幕左上方的“48MP”,打开4800万超清。 *如何设置全面屏模式? 点击设置 — 点击全面屏 — 进入全面屏设置会出现两个选项,可以选择经典导航也可以选择全面屏手势。选择全面屏手势,可进行手势学习,使用全面屏模式进行操作 *是否支持OTG功能? 支持。 *红米Note7出厂预装版本是Andriod 9.0吗? 该商品首批出厂操作系统:MIUI 10 (Andriod 9.0)。 *有呼吸灯吗?是否支持NFC? 是否支持收音机? 有呼吸灯,不支持NFC,支持收音机。 *4800万模式是否支持AI场景识别,能否有快速切换方式介绍? 4800万模式下不支持AI场景识别,普通相机模式下可支持AI识别。 *是否支持王者荣耀Vulkan 模式? 目前暂不支持王者荣耀Vulkan模式。      Redmi 红米Note 7 常见问题', 1199, 1099, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10804, 'Redmi Note7 4800万双摄千元机 满血骁龙660', '4000mAh超长续航 6GB+64GB 梦幻蓝 游戏智能手机 小米 红米', 0, '/goods-img/f6c46245-b957-41ed-b235-133c17cba7f9.jpg', '/goods-img/f6c46245-b957-41ed-b235-133c17cba7f9.jpg', '*相机默认1200w,如何设置4800w? 打开相机 — 右滑切换到“专业”模式 — 点击屏幕左上方的“48MP”,打开4800万超清。 *如何设置全面屏模式? 点击设置 — 点击全面屏 — 进入全面屏设置会出现两个选项,可以选择经典导航也可以选择全面屏手势。选择全面屏手势,可进行手势学习,使用全面屏模式进行操作 *是否支持OTG功能? 支持。 *红米Note7出厂预装版本是Andriod 9.0吗? 该商品首批出厂操作系统:MIUI 10 (Andriod 9.0)。 *有呼吸灯吗?是否支持NFC? 是否支持收音机? 有呼吸灯,不支持NFC,支持收音机。 *4800万模式是否支持AI场景识别,能否有快速切换方式介绍? 4800万模式下不支持AI场景识别,普通相机模式下可支持AI识别。 *是否支持王者荣耀Vulkan 模式? 目前暂不支持王者荣耀Vulkan模式。      Redmi 红米Note 7 常见问题', 1199, 1099, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10805, '【新品抢购】Redmi Note8Pro 6400万全场景四摄 液冷游戏芯', '4500mAh长续航 NFC 18W快充 红外遥控 6GB+64GB 贝母白 游戏智能手机 小米 红米', 0, '/goods-img/54985ce7-1df6-442f-9a28-0ff0bab924bd.jpg', '/goods-img/54985ce7-1df6-442f-9a28-0ff0bab924bd.jpg', '详情加载中...', 1399, 1399, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10806, '【新品抢购】Redmi Note8Pro 6400万全场景四摄 液冷游戏芯', '4500mAh长续航 NFC 18W快充 红外遥控 6GB+128GB 冰翡翠 游戏智能手机 小米 红米', 0, '/goods-img/e3de1717-e373-4544-9f1e-057a91fd2595.jpg', '/goods-img/e3de1717-e373-4544-9f1e-057a91fd2595.jpg', '详情加载中...', 1599, 1599, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10807, '【新品抢购】Redmi Note8Pro 6400万全场景四摄 液冷游戏芯', '4500mAh长续航 NFC 18W快充 红外遥控 6GB+64GB 电光灰 游戏智能手机 小米 红米', 0, '/goods-img/a1552f03-58ab-4b05-91ec-7df52af18a66.jpg', '/goods-img/a1552f03-58ab-4b05-91ec-7df52af18a66.jpg', '详情加载中...', 1399, 1399, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10808, 'Redmi Note7Pro 索尼4800万超清双摄 骁龙675', '18个月超长质保 4000mAh超长续航 6GB+128GB 亮黑色 游戏智能手机 小米 红米', 0, '/goods-img/647470fa-85b1-4626-99d0-d5b7512c8f23.jpg', '/goods-img/647470fa-85b1-4626-99d0-d5b7512c8f23.jpg', '详情加载中...', 1399, 1399, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10809, 'Redmi Note7pro 索尼4800万超清双摄 骁龙675', '18个月超长质保 4000mAh超长续航 6GB+128GB 镜花水月 游戏智能手机 小米 红米', 0, '/goods-img/edb8a694-84a5-47da-9bae-30f7a69d2c63.jpg', '/goods-img/edb8a694-84a5-47da-9bae-30f7a69d2c63.jpg', '详情加载中...', 1399, 1399, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10810, 'Redmi Note7Pro 索尼4800万超清双摄 骁龙675', '18个月超长质保 4000mAh超长续航 6GB+128GB 梦幻蓝 游戏智能手机 小米 红米', 0, '/goods-img/c76edfa6-c16e-45b9-9119-46d300739112.jpg', '/goods-img/c76edfa6-c16e-45b9-9119-46d300739112.jpg', '

商品介绍加载中...

', 1399, 1399, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10811, 'Redmi Note7Pro 索尼4800万超清双摄 骁龙675', '18个月超长质保 4000mAh超长续航 6GB+128GB 暮光金 游戏智能手机 小米 红米', 0, '/goods-img/bf0c2d17-3630-4709-af38-d7bd14a76f22.jpg', '/goods-img/bf0c2d17-3630-4709-af38-d7bd14a76f22.jpg', '详情加载中...', 1399, 1399, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10812, 'Redmi 7A 4000mAh超长续航 AI人脸解锁', '骁龙8核 标配10W充电器 整机防泼溅 3GB+32GB 磨砂黑 游戏智能手机 小米 红米', 0, '/goods-img/28c56015-cb20-44cb-86fb-246ad509e828.jpg', '/goods-img/28c56015-cb20-44cb-86fb-246ad509e828.jpg', '详情加载中...', 699, 599, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10813, 'Redmi 7A 4000mAh超长续航 AI人脸解锁', '骁龙8核 标配10W充电器 整机防泼溅 3GB+32GB 晨曦蓝 游戏智能手机 小米 红米', 0, '/goods-img/d845c984-f749-4f22-86a5-558677b1322c.jpg', '/goods-img/d845c984-f749-4f22-86a5-558677b1322c.jpg', '详情加载中...', 699, 599, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10814, 'Redmi 7A 4000mAh超长续航 AI人脸解锁', '骁龙8核 标配10W充电器 整机防泼溅 3GB+32GB 雾光金 游戏智能手机 小米 红米', 0, '/goods-img/56ac4c58-8742-40c8-b130-83b4d2925a8c.jpg', '/goods-img/56ac4c58-8742-40c8-b130-83b4d2925a8c.jpg', '详情加载中...', 599, 599, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10815, 'Redmi 7 4000mAh超长续航 骁龙632', '1200万AI双摄 18个月超长质保 AI人脸解锁 3GB+32GB 亮黑色 游戏智能手机 小米 红米', 0, '/goods-img/0647d1b4-d19a-4424-b6ac-68344addacb4.jpg', '/goods-img/0647d1b4-d19a-4424-b6ac-68344addacb4.jpg', '详情加载中...', 699, 699, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10816, 'Redmi 7 4000mAh超长续航 骁龙632', '1200万AI双摄 18个月超长质保 AI人脸解锁 3GB+32GB 魅夜红 游戏智能手机 小米 红米', 0, '/goods-img/711c54f0-f9d0-472e-b61b-94e25c628599.jpg', '/goods-img/711c54f0-f9d0-472e-b61b-94e25c628599.jpg', '详情加载中...', 699, 699, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10817, 'Redmi 7 4000mAh超长续航 骁龙632', '1200万AI双摄 18个月超长质保 AI人脸解锁 3GB+32GB 梦幻蓝 游戏智能手机 小米 红米', 0, '/goods-img/c8c97b68-3ba6-4f97-8940-d04c9e7c7302.jpg', '/goods-img/c8c97b68-3ba6-4f97-8940-d04c9e7c7302.jpg', '

商品介绍加载中...

', 699, 699, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10818, '小米MIX2S 骁龙845 AI感光双摄 四曲面陶瓷全面屏', '白色 多功能 NFC 6GB+128GB 游戏智能拍照手机', 51, '/goods-img/d423bb5c-60c8-4b66-bd72-3490b5d6461b.jpg', '/goods-img/d423bb5c-60c8-4b66-bd72-3490b5d6461b.jpg', '

商品介绍加载中...

', 2099, 1799, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10819, '小米MIX2S 骁龙845 AI感光双摄 四曲面陶瓷全面屏', '黑色 多功能 NFC 6GB+128GB 游戏智能拍照手机', 51, '/goods-img/9a554cae-5bec-4964-992f-e2f4de192e2c.jpg', '/goods-img/9a554cae-5bec-4964-992f-e2f4de192e2c.jpg', '

商品介绍加载中...

', 2099, 1799, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10820, '小米9 4800万超广角三摄 6GB+128GB全息幻彩蓝 骁龙855', '全网通4G 双卡双待 水滴全面屏拍照智能游戏手机', 51, '/goods-img/55a6dc67-1ed9-421a-9782-acdfa9c123e1.jpg', '/goods-img/55a6dc67-1ed9-421a-9782-acdfa9c123e1.jpg', '

商品介绍加载中...

', 2799, 2599, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10821, '小米9 4800万超广角三摄 8GB+256GB 透明版', '骁龙855 全网通4G 双卡双待 水滴全面屏拍照智能游戏手机', 51, '/goods-img/54249648-d37b-4b22-80dc-243e58ed56a1.jpg', '/goods-img/54249648-d37b-4b22-80dc-243e58ed56a1.jpg', '详情加载中...', 3699, 3699, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10822, '小米9 4800万超广角三摄 8GB+128GB 深空灰', '骁龙855 全网通4G 双卡双待 水滴全面屏拍照智能游戏手机', 51, '/goods-img/e8087861-89fd-43af-b64d-290864b0fe35.jpg', '/goods-img/e8087861-89fd-43af-b64d-290864b0fe35.jpg', '详情加载中...', 2999, 2799, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10823, '小米9 4800万超广角三摄 8GB+128GB 全息幻彩紫', '骁龙855 全网通4G 双卡双待 水滴全面屏拍照智能游戏手机', 51, '/goods-img/7a406989-061b-4f69-baa1-6fa499aa091d.jpg', '/goods-img/7a406989-061b-4f69-baa1-6fa499aa091d.jpg', '详情加载中...', 2999, 2799, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10824, '小米CC9e 索尼4800万旗舰相机 3200万美颜自拍 4030mAh', '屏幕指纹 白色恋人 6GB+64GB 游戏智能拍照手机', 51, '/goods-img/8fc9776e-9393-421d-998c-e516b3877dba.jpg', '/goods-img/8fc9776e-9393-421d-998c-e516b3877dba.jpg', '详情加载中...', 1399, 1299, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10825, '小米CC9e 索尼4800万旗舰相机 3200万美颜自拍 4030mAh', '屏幕指纹 暗夜王子 6GB+64GB 游戏智能拍照手机', 51, '/goods-img/033685d7-bf11-4389-9e52-ef5a51182306.jpg', '/goods-img/033685d7-bf11-4389-9e52-ef5a51182306.jpg', '详情加载中...', 1399, 1299, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10826, '小米CC9e 索尼4800万旗舰相机 3200万美颜自拍 4030mAh', '屏幕指纹 深蓝星球 6GB+64GB 游戏智能拍照手机', 51, '/goods-img/e8dba692-7fda-4f42-b0ee-6f51ca7dc77d.jpg', '/goods-img/e8dba692-7fda-4f42-b0ee-6f51ca7dc77d.jpg', '

商品介绍加载中...

', 1399, 1299, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10827, '小米CC9 3200万美颜自拍 索尼4800万超清三摄 多功能NFC', '4030mAh 深蓝星球 6GB+64GB 游戏智能拍照手机', 51, '/goods-img/387afca1-a14a-4ab8-9d99-120b7095029c.jpg', '/goods-img/387afca1-a14a-4ab8-9d99-120b7095029c.jpg', '详情加载中...', 1799, 1799, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10828, '小米CC9 3200万美颜自拍 索尼4800万超清三摄 多功能NFC', '4030mAh 白色恋人 6GB+64GB 游戏智能拍照手机', 51, '/goods-img/f96f376e-8341-4bad-ad2a-b3f12486958a.jpg', '/goods-img/f96f376e-8341-4bad-ad2a-b3f12486958a.jpg', '详情加载中...', 1799, 1799, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10829, '小米CC9 3200万美颜自拍 索尼4800万超清三摄 多功能NFC', '4030mAh 暗夜王子 6GB+128GB 游戏智能拍照手机', 51, '/goods-img/4c148e8e-7e26-4c74-a3d3-f5f37ae9248d.jpg', '/goods-img/4c148e8e-7e26-4c74-a3d3-f5f37ae9248d.jpg', '详情加载中...', 1999, 1999, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10830, '小米CC9美图定制版 索尼4800万AI三摄 3200万美颜自拍 全身美型', '多功能NFC 8GB+256GB 游戏智能拍照手机', 51, '/goods-img/92482741-3637-4cd3-91ff-cc5aeb0d3316.jpg', '/goods-img/92482741-3637-4cd3-91ff-cc5aeb0d3316.jpg', '

商品介绍加载中...

', 2599, 2599, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10831, '小米Play 流光渐变AI双摄 6GB+128GB 梦幻蓝', '移动4G+ 双卡双待 小水滴全面屏拍照游戏智能手机', 51, '/goods-img/f0b19f6c-6a8b-4128-8e5d-2e4953331c46.jpg', '/goods-img/f0b19f6c-6a8b-4128-8e5d-2e4953331c46.jpg', '详情加载中...', 999, 999, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10832, '小米Play 流光渐变AI双摄 6GB+128GB 黑色', '移动4G+ 双卡双待 小水滴全面屏拍照游戏智能手机', 51, '/goods-img/e39da33d-1b55-4e97-b8e6-824ac2cd1062.jpg', '/goods-img/e39da33d-1b55-4e97-b8e6-824ac2cd1062.jpg', '详情加载中...', 999, 999, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10833, '小米Play 流光渐变AI双摄 6GB+64GB 暮光金', '全网通4G 双卡双待 小水滴全面屏拍照游戏智能手机', 51, '/goods-img/2a93185a-8d3b-4908-af8c-c17db78e2fb0.jpg', '/goods-img/2a93185a-8d3b-4908-af8c-c17db78e2fb0.jpg', '详情加载中...', 899, 899, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10834, '小米9SE 骁龙712 索尼4800万超广角三摄 5.97英寸舒适握感', '全息幻彩蓝 8GB+128GB 游戏智能拍照手机', 51, '/goods-img/b28f3eac-0091-442f-90f3-68914bf947c7.jpg', '/goods-img/b28f3eac-0091-442f-90f3-68914bf947c7.jpg', '详情加载中...', 2099, 1899, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10835, '小米9 SE 4800万超广角三摄 骁龙712', '水滴全面屏 游戏智能拍照手机 6GB+64GB 深空灰 全网通4G 双卡双待', 51, '/goods-img/ef8370c4-ed8e-497f-9e10-185de4d01fe9.jpg', '/goods-img/ef8370c4-ed8e-497f-9e10-185de4d01fe9.jpg', '详情加载中...', 1799, 1599, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10836, '小米9SE 骁龙712 索尼4800万超广角三摄 5.97英寸舒适握感', '全息幻彩紫 8GB+128GB 游戏智能拍照手机', 51, '/goods-img/f436d00b-2253-4dcc-8b4a-d82e99af275a.jpg', '/goods-img/f436d00b-2253-4dcc-8b4a-d82e99af275a.jpg', '详情加载中...', 2099, 1999, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10837, '小米MIX3 骁龙845AIE AI 双摄', '磁动力滑盖全面屏 三星 AMOLED屏幕 黑色 8GB+128GB 游戏智能拍照手机', 51, '/goods-img/3bfc7c72-b56a-4088-8acf-e01e830ce72a.jpg', '/goods-img/3bfc7c72-b56a-4088-8acf-e01e830ce72a.jpg', '

商品介绍加载中...

', 2599, 2599, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10838, 'Redmi K20 索尼4800万超广角三摄 AMOLED弹出式全面屏', '第七代屏下指纹 6GB+128GB 冰川蓝 游戏智能手机 小米 红米', 0, '/goods-img/ed860c53-955b-4cfd-b605-a8b4bb959e2f.jpg', '/goods-img/ed860c53-955b-4cfd-b605-a8b4bb959e2f.jpg', '详情加载中...', 1999, 1799, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10839, 'Redmi K20 索尼4800万超广角三摄 AMOLED弹出式全面屏', '第七代屏下指纹 6GB+128GB 火焰红 游戏智能手机 小米 红米', 0, '/goods-img/8e64ea39-5477-482c-a200-2c12fdeff004.jpg', '/goods-img/8e64ea39-5477-482c-a200-2c12fdeff004.jpg', '详情加载中...', 1999, 1799, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10840, 'Redmi K20 索尼4800万超广角三摄 AMOLED弹出式全面屏', '第七代屏下指纹 6GB+128GB 碳纤黑 游戏智能手机 小米 红米', 0, '/goods-img/38a69084-0bc4-479e-a5ba-aed135dee974.jpg', '/goods-img/38a69084-0bc4-479e-a5ba-aed135dee974.jpg', '

商品介绍加载中...

', 1999, 1799, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10841, '红米6A 1300万高清相机 AI人脸解锁 12nm高性能处理器', '3GB+32GB 流沙金 游戏智能手机 小米', 0, '/goods-img/6c77e8f9-11d8-42c3-925e-4396d0d3709f.jpg', '/goods-img/6c77e8f9-11d8-42c3-925e-4396d0d3709f.jpg', '详情加载中...', 649, 599, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10842, '红米6A 1300万高清相机 AI人脸解锁 12nm高性能处理器', '3GB+32GB 铂银灰 游戏智能手机 小米', 0, '/goods-img/17b2eb9f-7289-45f8-b26a-114ec29ceb3c.jpg', '/goods-img/17b2eb9f-7289-45f8-b26a-114ec29ceb3c.jpg', '详情加载中...', 649, 599, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10843, '小米 红米6A 全网通版 2GB内存', '樱花粉 16GB 移动联通电信4G手机 双卡双待', 51, '/goods-img/1ba819c2-dc89-41d9-86a9-4649418972da.jpg', '/goods-img/1ba819c2-dc89-41d9-86a9-4649418972da.jpg', '

商品介绍加载中...

', 549, 549, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10844, '红米6A 1300万高清相机 AI人脸解锁 12nm高性能处理器', '3GB+32GB 巴厘蓝 游戏智能手机 小米', 0, '/goods-img/1ef84d7e-d804-4064-9140-a53607aa8df2.jpg', '/goods-img/1ef84d7e-d804-4064-9140-a53607aa8df2.jpg', '详情加载中...', 649, 599, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10845, '小米Max3 5500mAh充电宝级电量 AI双摄 全金属机身', '骁龙八核处理器 蓝色 6GB+128GB 游戏智能拍照手机', 51, '/goods-img/b6c3eea7-9d34-4ac0-ba66-2fde6f26253b.jpg', '/goods-img/b6c3eea7-9d34-4ac0-ba66-2fde6f26253b.jpg', '详情加载中...', 1599, 1499, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10846, '小米Max3 5500mAh充电宝级电量 AI双摄 全金属机身', '骁龙八核处理器 黑色 6GB+128GB 游戏智能拍照手机', 51, '/goods-img/30574476-f5bc-4f3c-80f6-4da22ea48f48.jpg', '/goods-img/30574476-f5bc-4f3c-80f6-4da22ea48f48.jpg', '详情加载中...', 1599, 1499, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10847, '小米Max3 5500mAh充电宝级电量 AI双摄 全金属机身', '骁龙八核处理器 金色 6GB+128GB 游戏智能拍照手机', 51, '/goods-img/114e92f8-bf78-481e-8d8a-9936d026d9d4.jpg', '/goods-img/114e92f8-bf78-481e-8d8a-9936d026d9d4.jpg', '详情加载中...', 1599, 1499, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10848, 'Redmi Note8 4800万全场景四摄 4000mAh长续航', '高通骁龙665 18W快充 小金刚品质保证 4GB+64GB 梦幻蓝 游戏智能手机 小米 红米', 0, '/goods-img/8d3ebf2d-8da7-478c-bd6c-e7a869fdde97.jpg', '/goods-img/8d3ebf2d-8da7-478c-bd6c-e7a869fdde97.jpg', '

商品介绍加载中...

', 999, 999, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10849, 'Redmi Note8 4800万全场景四摄 4000mAh长续航', '高通骁龙665 18W快充 小金刚品质保证 4GB+64GB 皓月白 游戏智能手机 小米 红米', 0, '/goods-img/b4ff98bc-ad00-48f7-ac64-0d52780d4c48.jpg', '/goods-img/b4ff98bc-ad00-48f7-ac64-0d52780d4c48.jpg', '

商品介绍加载中...

', 999, 999, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10850, 'Redmi Note8 4800万全场景四摄 4000mAh长续航', '高通骁龙665 18W快充 小金刚品质保证 4GB+64GB 曜石黑 游戏智能手机 小米 红米', 0, '/goods-img/b82cc8fd-075b-44d3-b211-8ea633fe2ffe.jpg', '/goods-img/b82cc8fd-075b-44d3-b211-8ea633fe2ffe.jpg', '

商品介绍加载中...

', 999, 999, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10851, '小米(MI) 小米8青春版 手机 深空灰', '全网通 6G+128G', 51, '/goods-img/52425573-6311-4877-bad8-1c04bf01e9d3.jpg', '/goods-img/52425573-6311-4877-bad8-1c04bf01e9d3.jpg', '

商品介绍加载中...

', 1599, 1168, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10852, '小米(MI) 小米8青春版 手机 梦幻蓝', '全网通 4G+128G', 51, '/goods-img/8c1c9fb2-26aa-4fa0-b9ce-cf278d827fa6.jpg', '/goods-img/8c1c9fb2-26aa-4fa0-b9ce-cf278d827fa6.jpg', '

商品介绍加载中...

', 1599, 1599, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10853, '小米(MI) 小米8青春版 手机 暮光金', '全网通 6G+64G', 51, '/goods-img/bd94d7e0-f56f-4b7f-8653-b8a4e267bd15.jpg', '/goods-img/bd94d7e0-f56f-4b7f-8653-b8a4e267bd15.jpg', '

商品介绍加载中...

', 1299, 1068, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10854, '小米 红米Note8 pro 手机【6400万四摄', '液冷游戏芯】 冰翡翠 全网通6+128', 51, '/goods-img/42913aa4-4a49-4121-9c80-3434c12d0ac9.jpg', '/goods-img/42913aa4-4a49-4121-9c80-3434c12d0ac9.jpg', '

商品介绍加载中...

', 1799, 1599, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10855, '小米 红米Note8 pro 手机【6400万四摄', '液冷游戏芯】 贝母白 全网通6+128', 51, '/goods-img/777ebd38-965d-4c77-970e-f1e25022255f.jpg', '/goods-img/777ebd38-965d-4c77-970e-f1e25022255f.jpg', '

商品介绍加载中...

', 1799, 1599, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10856, '小米 红米Note8 pro 手机【6400万四摄', '液冷游戏芯】 电光灰 全网通6+128', 51, '/goods-img/db21f41b-34ac-4bc7-a50f-1f812b1522d1.jpg', '/goods-img/db21f41b-34ac-4bc7-a50f-1f812b1522d1.jpg', '

商品介绍加载中...

', 1799, 1599, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10857, '小米(MI) 小米8 游戏手机 黑', '6GB+64GB', 51, '/goods-img/63588dfb-f85f-41a2-8198-c7ae66aa0261.png', '/goods-img/63588dfb-f85f-41a2-8198-c7ae66aa0261.png', '

商品介绍加载中...

', 1698, 1568, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10858, '小米(MI) 小米8 游戏手机 白', '6GB+64GB', 51, '/goods-img/d55d6e4a-99e7-4a3d-86a4-9b3899a63b42.png', '/goods-img/d55d6e4a-99e7-4a3d-86a4-9b3899a63b42.png', '

商品介绍加载中...

', 1698, 1568, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10859, '小米(MI) 小米8 游戏手机 蓝', '8GB+128GB', 51, '/goods-img/5a2a90aa-fe2c-4bb0-8d8d-1ac1613f453a.png', '/goods-img/5a2a90aa-fe2c-4bb0-8d8d-1ac1613f453a.png', '

商品介绍加载中...

', 1998, 1868, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10860, '小米(MI) 小米8 游戏手机 金', '6GB+128GB', 51, '/goods-img/c1cdb555-f605-4226-906a-022483612319.png', '/goods-img/c1cdb555-f605-4226-906a-022483612319.png', '

商品介绍加载中...

', 1898, 1838, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10861, '小米(MI) 小米8青春版 手机 深空灰', '全网通(6G+128G)', 51, '/goods-img/fafda3af-7741-47f2-936e-c0d9030fbf5b.png', '/goods-img/fafda3af-7741-47f2-936e-c0d9030fbf5b.png', '

商品介绍加载中...

', 1188, 1188, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10862, '小米(MI) 小米8青春版 手机 梦幻蓝', '全网通(6G+64G)', 51, '/goods-img/ef5ac8cb-5d4e-4dc6-bece-27c9ff5a2e1c.png', '/goods-img/ef5ac8cb-5d4e-4dc6-bece-27c9ff5a2e1c.png', '

商品介绍加载中...

', 1388, 1388, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10863, '小米(MI) 小米8青春版 手机 暮光金', '全网通(6G+128G)', 51, '/goods-img/d8b30b9f-faa4-4a0d-84bc-53b9c4745977.png', '/goods-img/d8b30b9f-faa4-4a0d-84bc-53b9c4745977.png', '

商品介绍加载中...

', 1578, 1578, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10864, '小米 红米Redmi 7 全网通4G', '双卡双待 幻彩渐变AI双摄 水滴全面屏拍照游戏智能手机 梦幻蓝 4GB+64GB', 51, '/goods-img/18ce5224-c98d-4a9c-a024-5ac5b6f9a2d7.jpg', '/goods-img/18ce5224-c98d-4a9c-a024-5ac5b6f9a2d7.jpg', '

商品介绍加载中...

', 1200, 808, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10865, '小米 红米Redmi 7 全网通4G', '双卡双待 幻彩渐变AI双摄 水滴全面屏拍照游戏智能手机 亮黑色 4GB+64GB', 51, '/goods-img/f7a9a98d-9e3f-4443-b8a7-5612bcd7c1d0.jpg', '/goods-img/f7a9a98d-9e3f-4443-b8a7-5612bcd7c1d0.jpg', '

商品介绍加载中...

', 1200, 818, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10866, '小米 红米Redmi 7 全网通4G', '双卡双待 幻彩渐变AI双摄 水滴全面屏拍照游戏智能手机 魅夜红 4GB+64GB', 51, '/goods-img/02523f49-742b-4c45-b59b-f550fe5a60ae.jpg', '/goods-img/02523f49-742b-4c45-b59b-f550fe5a60ae.jpg', '

商品介绍加载中...

', 1200, 818, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10867, '小米 小米8屏幕指纹版 手机 黑色', '全网通(6G + 128G )', 51, '/goods-img/35b9c185-2ca6-4052-af40-2abd2157f200.png', '/goods-img/35b9c185-2ca6-4052-af40-2abd2157f200.png', '产品信息Product Information', 2099, 1808, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10868, '小米 小米8屏幕指纹版 手机 透明版', '全网通(8G + 128G)', 51, '/goods-img/fcd1faf9-10b5-4318-b92b-36105be8752f.png', '/goods-img/fcd1faf9-10b5-4318-b92b-36105be8752f.png', '产品信息Product Information', 2499, 2028, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10869, '小米 小米8屏幕指纹版 手机 暮光金', '全网通(6G + 128G )', 51, '/goods-img/e9818435-c510-4042-91e1-734a818a2577.png', '/goods-img/e9818435-c510-4042-91e1-734a818a2577.png', '产品信息Product Information', 2099, 2099, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10870, '小米 红米6 全网通版 3GB内存', '流沙金 32GB 移动联通电信4G手机 双卡双待', 51, '/goods-img/515706fb-a5f8-4d72-a08e-7523cf4ea113.jpg', '/goods-img/515706fb-a5f8-4d72-a08e-7523cf4ea113.jpg', '

商品介绍加载中...

', 699, 699, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10871, '小米 红米6 3GB+32GB 铂银灰', '全网通4G手机 双卡双待 老人机 智能拍照手机', 51, '/goods-img/bcec0048-e992-4e57-9aaf-ddbd9fe852ce.jpg', '/goods-img/bcec0048-e992-4e57-9aaf-ddbd9fe852ce.jpg', '

商品介绍加载中...

', 699, 699, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10872, '小米(MI) 小米8屏幕指纹版 全面屏游戏手机 曜石黑(屏幕指纹版)', '6G+128G', 51, '/goods-img/e1c2b06f-fd06-4242-acb7-9ebd7179181b.png', '/goods-img/e1c2b06f-fd06-4242-acb7-9ebd7179181b.png', '

商品介绍加载中...

', 2199, 1818, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10873, '小米(MI) 小米8屏幕指纹版 全面屏游戏手机 透明版(屏幕指纹版)', '8G+128G', 51, '/goods-img/314274fc-1ee0-474d-bbb5-b9c70a8a9573.png', '/goods-img/314274fc-1ee0-474d-bbb5-b9c70a8a9573.png', '

商品介绍加载中...

', 2599, 2018, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10874, '小米(MI) 小米8屏幕指纹版 全面屏游戏手机 暮光金(屏幕指纹版)', '8G+128G', 51, '/goods-img/c2905bd8-bd68-4672-bada-b8a202a9327e.png', '/goods-img/c2905bd8-bd68-4672-bada-b8a202a9327e.png', '

商品介绍加载中...

', 2599, 2058, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10875, '小米8 游戏手机 全面屏 黑色', '全网通(6G+64G)', 51, '/goods-img/5afd1749-a3bc-41c2-90b2-928ede8aedda.jpg', '/goods-img/5afd1749-a3bc-41c2-90b2-928ede8aedda.jpg', '

商品介绍加载中...

', 1799, 1558, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10876, '小米8 游戏手机 全面屏 白色', '全网通(6G+64G)', 51, '/goods-img/a96dd5bc-2d74-4d57-9336-45a8ac09a363.jpg', '/goods-img/a96dd5bc-2d74-4d57-9336-45a8ac09a363.jpg', '

商品介绍加载中...

', 1799, 1550, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10877, '小米8 游戏手机 全面屏 白色', '全网通(6G+128G)', 51, '/goods-img/25e44283-a440-4e64-bb27-1887370c3d2e.jpg', '/goods-img/25e44283-a440-4e64-bb27-1887370c3d2e.jpg', '

商品介绍加载中...

', 1999, 1798, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10878, '小米8 游戏手机 全面屏 金色', '全网通(6G+128G)', 51, '/goods-img/6b5e5711-8ae6-4f66-bd22-30c9be85d3c6.jpg', '/goods-img/6b5e5711-8ae6-4f66-bd22-30c9be85d3c6.jpg', '

商品介绍加载中...

', 1999, 1849, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10879, '小米8 游戏手机 全面屏 黑色', '全网通(6G+128G)', 51, '/goods-img/040a3aa6-1699-4eca-ac67-5021cc419979.jpg', '/goods-img/040a3aa6-1699-4eca-ac67-5021cc419979.jpg', '

商品介绍加载中...

', 1999, 1849, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10880, '小米8 游戏手机 全面屏 金色', '全网通(6G+64G)', 51, '/goods-img/47c28778-88a4-42fd-bb4d-c93fe8df36b5.jpg', '/goods-img/47c28778-88a4-42fd-bb4d-c93fe8df36b5.jpg', '

商品介绍加载中...

', 1799, 1598, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10881, '小米8 游戏手机 全面屏 屏幕指纹版', '暮光金 全网通(8G+128G)', 51, '/goods-img/no-img.png', '/goods-img/no-img.png', '

商品介绍加载中...

', 3799, 2199, 10000, '1', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-24 19:46:59'), (10882, '小米8 游戏手机 全面屏 蓝色', '全网通(6G+64G)', 51, '/goods-img/no-img.png', '/goods-img/no-img.png', '

商品介绍加载中...

', 1799, 1598, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10883, '小米8 游戏手机 全面屏 金色', '全网通(6G+256G)', 51, '/goods-img/no-img.png', '/goods-img/no-img.png', '

商品介绍加载中...

', 3199, 2158, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10884, '小米8 游戏手机 全面屏 白色', '全网通(6G+256G)', 51, '/goods-img/no-img.png', '/goods-img/no-img.png', '

商品介绍加载中...

', 3199, 2158, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10885, '小米8 游戏手机 全面屏 蓝色', '全网通(6G+256G)', 51, '/goods-img/no-img.png', '/goods-img/no-img.png', '

商品介绍加载中...

', 3199, 2158, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10886, '小米8 游戏手机 全面屏 黑色', '全网通(6G+256G)', 51, '/goods-img/no-img.png', '/goods-img/no-img.png', '

商品介绍加载中...

', 3199, 3199, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10887, '小米8 游戏手机 全面屏 透明探索版', '全网通(8G+128G)', 51, '/goods-img/no-img.png', '/goods-img/no-img.png', '

商品介绍加载中...

', 4299, 4299, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-19 08:47:09'), (10888, '小米8 游戏手机 全面屏 屏幕指纹版', '暮光金 全网通(6G+128G)', 51, '/goods-img/no-img.png', '/goods-img/no-img.png', '

商品介绍加载中...

', 3399, 3399, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-19 08:47:09'), (10889, '小米8 游戏手机 全面屏 蓝色', '全网通(6G+128G)', 51, '/goods-img/no-img.png', '/goods-img/no-img.png', '

商品介绍加载中...

', 1849, 1849, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-19 08:47:09'), (10890, '小米 红米7 手机 Redmi7', 'AI双摄 拍照游戏手机 全网通双卡双待 亮黑色 4G+64G 全网通', 51, '/goods-img/b6084354-1841-4241-ba7b-7e97186a9076.jpg', '/goods-img/b6084354-1841-4241-ba7b-7e97186a9076.jpg', '

商品介绍加载中...

', 1299, 808, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-18 13:38:32'), (10891, '小米 红米7 手机 Redmi7', 'AI双摄 拍照游戏手机 全网通双卡双待 魅夜红 4G+64G 全网通', 51, '/goods-img/7b4e03b1-eca7-42f5-8dda-14d02d3ab318.jpg', '/goods-img/7b4e03b1-eca7-42f5-8dda-14d02d3ab318.jpg', '

商品介绍加载中...

', 1009, 818, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-22 23:33:12'), (10892, '小米 红米7 手机 Redmi7', 'AI双摄 拍照游戏手机 全网通双卡双待 梦幻蓝 3G+32G 全网通', 51, '/goods-img/7bca8b59-35f3-480a-a95d-99efcbb8cfda.jpg', '/goods-img/7bca8b59-35f3-480a-a95d-99efcbb8cfda.jpg', '

商品介绍加载中...

', 787, 715, 10000, '', 0, 0, '2019-09-18 13:38:32', 0, '2019-09-22 23:33:12'), (10893, 'HUAWEI Mate 30 Pro 双4000万徕卡电影四摄', '超曲面OLED环幕屏 8GB+256GB 全网通4G版(星河银)', 0, '/goods-img/mate30p2.png', '/goods-img/mate30p2.png', '

', 5399, 5399, 10000, '重构想象', 0, 0, '2019-09-19 23:17:39', 0, '2019-09-19 23:17:39'), (10894, 'HUAWEI Mate 30 Pro', '超曲面OLED环幕屏 8GB+128GB 全网通4G版(翡冷翠)', 0, '/goods-img/mate30p3.png', '/goods-img/mate30p3.png', '

', 5399, 5399, 10000, '重构想象', 0, 0, '2019-09-19 23:20:24', 0, '2019-09-19 23:20:24'), (10895, 'HUAWEI Mate 30 4000万超感光徕卡影像', 'OLED全面屏 8GB+128GB 全网通4G版 (罗兰紫)', 46, '/goods-img/mate30-3.png', '/goods-img/mate30-3.png', '

', 3999, 3999, 10000, '重构想象', 0, 0, '2019-09-19 23:22:22', 0, '2019-11-27 00:16:03'), (10902, '华为 HUAWEI P40 冰霜银 全网通5G手机', '麒麟990 5G SoC芯片 5000万超感知徕卡三摄 30倍数字变焦 6GB+128GB', 46, 'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/p40-silver.png', 'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/p40-silver.png', '', 4399, 4299, 10000, '超感知影像', 0, 0, '2020-03-27 10:07:37', 0, '2020-05-15 17:18:30'), (10905, 'Apple iPhone12 (A2404) 蓝色 支持移动联通电信5G 双卡双待手机', 'A14仿生芯片,6.1英寸超视网膜XDR显示屏,超瓷晶面板,升维大提速,现实力登场!', 47, 'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iPhone12-blue.png', 'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iPhone12-blue.png', '', 6299, 6199, 10000, '升维,大提速。', 0, 0, '2020-10-14 10:30:06', 0, '2020-10-16 17:13:43'), (10906, 'Apple iPhone12 Pro (A2408) 128GB 海蓝色 支持移动联通电信5G 双卡双待手机', 'A14仿生芯片,6.1英寸超视网膜XDR显示屏,激光雷达扫描仪,超瓷晶面板,现实力登场!', 47, 'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-12-pro-blue-hero.png', 'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-12-pro-blue-hero.png', '', 8499, 8499, 10000, '自我再飞跃', 0, 0, '2020-10-14 10:32:55', 0, '2020-10-16 17:13:43'), (10907, 'HUAWEI Mate 40 Pro 全网通5G手机 8GB+512GB(秘银色)', '5nm麒麟9000旗舰芯片 | 超感光徕卡电影影象', 46, 'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/mate40-silver.png', 'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/mate40-silver.png', '


', 6488, 6488, 10000, '跃见非凡', 0, 0, '2020-10-22 22:07:32', 0, '2020-10-22 22:12:37'), (10908, 'HUAWEI Mate 40 Pro 全网通5G手机 8GB+512GB(黄色)', '5nm麒麟9000旗舰芯片 | 超感光徕卡电影影象', 46, 'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/mate40-white.png', 'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/mate40-white.png', '


', 6488, 6488, 9999, '跃见非凡', 0, 0, '2020-10-22 22:08:42', 0, '2021-04-20 21:08:32'), (10909, 'HUAWEI Mate 40 Pro+ 5G 全网通 12GB+256GB(陶瓷白)', '5nm麒麟9000旗舰芯片 | 超感光徕卡电影影象', 46, 'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/mate40pro%2B.png', 'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/mate40pro%2B.png', '


', 7988, 7988, 10000, '跃见非凡', 1, 0, '2020-10-22 22:12:15', 0, '2021-04-20 22:44:29'), (10915, 'Apple iPhone 13 (A2634) 256GB 粉色', '解锁超能力!超先进双摄系统,超强耐用性,超劲续航大提升!', 47, 'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-13-pink-select-2021.png', 'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-13-pink-select-2021.png', '

', 6999, 6799, 9999, '解锁超能力', 0, 0, '2021-12-28 13:32:06', 0, '2021-12-28 13:32:06'), (10916, 'Apple iPhone 13 Pro 远峰蓝色', '自适应高刷新率,画面更流畅、响应更灵敏,电影效果模式随手拍大片!', 47, 'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-13-pro-family-hero.png', 'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/iphone-13-pro-family-hero.png', '

', 8199, 7999, 10000, '强得很', 0, 0, '2021-12-28 13:39:01', 0, '2021-12-28 19:00:56'), (10917, '苹果(Apple)iPad2021年新款第9代平板电脑', '10.2英寸 银色 64G标配【 视网膜屏 】', 34, 'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/ipad-2021-hero-silver-wifi-select.png', 'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/ipad-2021-hero-silver-wifi-select.png', '

', 2999, 2599, 10000, '事事玩得转', 0, 0, '2021-12-28 13:56:33', 0, '2021-12-28 13:56:33'), (10918, 'Apple AirPods (第三代)', 'AirPods第三代搭载空间音频和自适应均衡全新登场!更长续航\\无线充电\\抗汗抗水等更多功能提供美妙体验!', 33, 'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/MME73_AV4_GEO_CN.jpeg', 'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/MME73_AV4_GEO_CN.jpeg', '

', 1599, 1399, 10000, '美妙新声', 0, 0, '2021-12-28 14:04:07', 0, '2021-12-28 18:58:35'), (10919, 'Apple Watch Series 7 智能手表', '全盘坚固表里如一!显示屏更大,耐用性提升,充电速度更快!', 33, 'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/MKUU3_VW_34FR%2Bwatch-45-alum-midnight-cell-7s_VW_34FR_WF_CO.jpeg', 'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/MKUU3_VW_34FR%2Bwatch-45-alum-midnight-cell-7s_VW_34FR_WF_CO.jpeg', '

', 2999, 3399, 10000, '全屏先手', 0, 0, '2021-12-28 14:10:45', 0, '2021-12-28 17:45:38'), (10920, 'MacBook Pro 16英寸 M1 Pro芯片', '16G 512G 银色。M1Pro和M1Max芯片,霸气不封顶,120Hz高刷Mini-LED屏幕,更长续航。', 35, 'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/mbp16-silver-select-202110_GEO_CN.jpeg', 'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/mbp16-silver-select-202110_GEO_CN.jpeg', '

', 20999, 18999, 9999, '强者的强', 0, 0, '2021-12-28 15:13:27', 0, '2021-12-28 17:48:16'), (10921, 'HUAWEI P50 Pro 4G全网通 8GB+512GB可可茶金', '麒麟9000芯片,万象双环设计', 46, 'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/p50-gold.png', 'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/p50-gold.png', '

', 7888, 7488, 9999, '万象新生', 0, 0, '2021-12-28 15:23:01', 0, '2021-12-28 17:45:10'), (10922, 'HUAWEI P50 雪域白', '骁龙888,4G全网通,原色双影像单元,万象双环设计', 46, 'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/p50-white.png', 'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/p50-white.png', '

', 4888, 4488, 10000, '万象新生', 0, 0, '2021-12-28 15:45:32', 0, '2021-12-28 18:57:21'), (10923, 'HUAWEI P50 Pocket 4G全网通 超光谱影像系统 创新双屏操作体验 P50宝盒 8GB+256GB曜石黑华为折叠屏手机', '华为P50Pocket新品,华为年度旗舰折叠屏手机', 46, 'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/p50-pocket-black.png', 'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/p50-pocket-black.png', '

', 9088, 8988, 10000, '折叠万象', 0, 0, '2021-12-28 15:57:12', 0, '2021-12-28 15:57:12'), (10924, 'HUAWEI P50 Pocket 4G全网通 超光谱影像系统 创新双屏操作体验 P50宝盒 12GB+512GB晶钻白华为折叠屏手机', '华为P50Pocket新品,华为年度旗舰折叠屏手机', 46, 'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/p50-pocket-white.png', 'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/p50-pocket-white.png', '

', 12988, 10988, 10000, '折叠万象', 0, 0, '2021-12-28 16:00:58', 0, '2021-12-28 16:00:58'), (10925, 'HUAWEI P50 Pocket 4G全网通 超光谱影像系统 创新双屏操作体验 P50宝盒 12GB+512GB鎏光金华为折叠屏手机', '华为P50Pocket新品,华为年度旗舰折叠屏手机', 46, 'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/p50-pocket-gold.png', 'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/p50-pocket-gold.png', '

', 12988, 10988, 10000, '折叠万象', 0, 0, '2021-12-28 16:02:50', 0, '2021-12-28 16:02:50'), (10926, '华为笔记本电脑MateBook X Pro 2022', '原色全面屏,轻薄高能,超级终端', 33, 'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/MateBook%20X%20Pro.png', 'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/MateBook%20X%20Pro.png', '

', 11699, 10499, 10000, '入目惊鸿', 0, 0, '2021-12-28 17:31:30', 0, '2021-12-28 17:46:17'), (10927, 'HUAWEI MatePad Pro 12.6英寸', '8+256GB WIFI曜石灰 麒麟9000E OLED全面屏平板电脑', 34, 'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/matepad-pro.png', 'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/matepad-pro.png', '

', 4899, 4699, 10000, '创造无界', 0, 0, '2021-12-28 17:50:31', 0, '2021-12-28 18:56:13'), (10928, 'HUAWEI WATCH 3 Pro智能手表', '运动智能手表 尊享款 eSIM独立通话强劲续航心脏与呼吸健康', 33, 'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/watch-3-pro.png', 'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/watch-3-pro.png', '

', 3999, 3899, 10000, '一表万象', 0, 0, '2021-12-28 18:39:05', 0, '2021-12-28 18:39:05'), (10929, '华为 HUAWEI Sound X 2021', '智能音箱幻彩光随声动', 33, 'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/soundx.png', 'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/soundx.png', '

', 2399, 2199, 10000, '声声出色', 0, 0, '2021-12-28 18:41:39', 0, '2021-12-28 18:41:39'), (10930, '华为FreeBuds Pro无线耳机', '主动降噪真无线蓝牙耳机/入耳式耳机/环境音/人声透传/双连接', 33, 'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/freebuds-pro.png', 'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/freebuds-pro.png', '

', 899, 749, 10000, '动态降噪 听我想听', 0, 0, '2021-12-28 18:47:15', 0, '2021-12-28 18:47:15'); -- for AT mode you must to init this sql for you business database. the seata server not need it. CREATE TABLE IF NOT EXISTS `undo_log` ( `branch_id` BIGINT NOT NULL COMMENT 'branch transaction id', `xid` VARCHAR(128) NOT NULL COMMENT 'global transaction id', `context` VARCHAR(128) NOT NULL COMMENT 'undo_log context,such as serialization', `rollback_info` LONGBLOB NOT NULL COMMENT 'rollback info', `log_status` INT(11) NOT NULL COMMENT '0:normal status,1:defense status', `log_created` DATETIME(6) NOT NULL COMMENT 'create datetime', `log_modified` DATETIME(6) NOT NULL COMMENT 'modify datetime', UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`) ) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8mb4 COMMENT ='AT transaction mode undo table'; ================================================ FILE: static-files/newbee_mall_cloud_order_db.sql ================================================ # 创建订单服务所需数据 CREATE DATABASE /*!32312 IF NOT EXISTS*/`newbee_mall_cloud_order_db` /*!40100 DEFAULT CHARACTER SET utf8 */; USE `newbee_mall_cloud_order_db`; DROP TABLE IF EXISTS `tb_newbee_mall_order`; CREATE TABLE `tb_newbee_mall_order` ( `order_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '订单表主键id', `order_no` varchar(20) NOT NULL DEFAULT '' COMMENT '订单号', `user_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '用户主键id', `total_price` int(11) NOT NULL DEFAULT '1' COMMENT '订单总价', `pay_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '支付状态:0.未支付,1.支付成功,-1:支付失败', `pay_type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '0.无 1.支付宝支付 2.微信支付', `pay_time` timestamp DEFAULT NULL COMMENT '支付时间', `order_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '订单状态:0.待支付 1.已支付 2.配货完成 3:出库成功 4.交易成功 -1.手动关闭 -2.超时关闭 -3.商家关闭', `extra_info` varchar(100) NOT NULL DEFAULT '' COMMENT '订单body', `is_deleted` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标识字段(0-未删除 1-已删除)', `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最新修改时间', PRIMARY KEY (`order_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; # Dump of table tb_newbee_mall_order_address # ------------------------------------------------------------ DROP TABLE IF EXISTS `tb_newbee_mall_order_address`; CREATE TABLE `tb_newbee_mall_order_address` ( `order_id` bigint(20) NOT NULL, `user_name` varchar(30) NOT NULL DEFAULT '' COMMENT '收货人姓名', `user_phone` varchar(11) NOT NULL DEFAULT '' COMMENT '收货人手机号', `province_name` varchar(32) NOT NULL DEFAULT '' COMMENT '省', `city_name` varchar(32) NOT NULL DEFAULT '' COMMENT '城', `region_name` varchar(32) NOT NULL DEFAULT '' COMMENT '区', `detail_address` varchar(64) NOT NULL DEFAULT '' COMMENT '收件详细地址(街道/楼宇/单元)', PRIMARY KEY (`order_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='订单收货地址关联表'; # Dump of table tb_newbee_mall_order_item # ------------------------------------------------------------ DROP TABLE IF EXISTS `tb_newbee_mall_order_item`; CREATE TABLE `tb_newbee_mall_order_item` ( `order_item_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '订单关联购物项主键id', `order_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '订单主键id', `goods_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '关联商品id', `goods_name` varchar(200) NOT NULL DEFAULT '' COMMENT '下单时商品的名称(订单快照)', `goods_cover_img` varchar(200) NOT NULL DEFAULT '' COMMENT '下单时商品的主图(订单快照)', `selling_price` int(11) NOT NULL DEFAULT '1' COMMENT '下单时商品的价格(订单快照)', `goods_count` int(11) NOT NULL DEFAULT '1' COMMENT '数量(订单快照)', `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`order_item_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; DROP TABLE IF EXISTS `tb_newbee_mall_user_address`; CREATE TABLE `tb_newbee_mall_user_address` ( `address_id` bigint(20) NOT NULL AUTO_INCREMENT, `user_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '用户主键id', `user_name` varchar(30) NOT NULL DEFAULT '' COMMENT '收货人姓名', `user_phone` varchar(11) NOT NULL DEFAULT '' COMMENT '收货人手机号', `default_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否为默认 0-非默认 1-是默认', `province_name` varchar(32) NOT NULL DEFAULT '' COMMENT '省', `city_name` varchar(32) NOT NULL DEFAULT '' COMMENT '城', `region_name` varchar(32) NOT NULL DEFAULT '' COMMENT '区', `detail_address` varchar(64) NOT NULL DEFAULT '' COMMENT '收件详细地址(街道/楼宇/单元)', `is_deleted` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标识字段(0-未删除 1-已删除)', `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', PRIMARY KEY (`address_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='收货地址表'; -- for AT mode you must to init this sql for you business database. the seata server not need it. CREATE TABLE IF NOT EXISTS `undo_log` ( `branch_id` BIGINT NOT NULL COMMENT 'branch transaction id', `xid` VARCHAR(128) NOT NULL COMMENT 'global transaction id', `context` VARCHAR(128) NOT NULL COMMENT 'undo_log context,such as serialization', `rollback_info` LONGBLOB NOT NULL COMMENT 'rollback info', `log_status` INT(11) NOT NULL COMMENT '0:normal status,1:defense status', `log_created` DATETIME(6) NOT NULL COMMENT 'create datetime', `log_modified` DATETIME(6) NOT NULL COMMENT 'modify datetime', UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`) ) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8mb4 COMMENT ='AT transaction mode undo table'; ================================================ FILE: static-files/newbee_mall_cloud_recommend_db.sql ================================================ # 创建推荐服务所需数据 CREATE DATABASE /*!32312 IF NOT EXISTS*/`newbee_mall_cloud_recommend_db` /*!40100 DEFAULT CHARACTER SET utf8 */; USE `newbee_mall_cloud_recommend_db`; # 创建首页推荐表 DROP TABLE IF EXISTS `tb_newbee_mall_index_config`; CREATE TABLE `tb_newbee_mall_index_config` ( `config_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '首页配置项主键id', `config_name` varchar(50) NOT NULL DEFAULT '' COMMENT '显示字符(配置搜索时不可为空,其他可为空)', `config_type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '1-搜索框热搜 2-搜索下拉框热搜 3-(首页)热销商品 4-(首页)新品上线 5-(首页)为你推荐', `goods_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '商品id 默认为0', `redirect_url` varchar(100) NOT NULL DEFAULT '##' COMMENT '点击后的跳转地址(默认不跳转)', `config_rank` int(11) NOT NULL DEFAULT '0' COMMENT '排序值(字段越大越靠前)', `is_deleted` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标识字段(0-未删除 1-已删除)', `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `create_user` int(11) NOT NULL DEFAULT '0' COMMENT '创建者id', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最新修改时间', `update_user` int(11) DEFAULT '0' COMMENT '修改者id', PRIMARY KEY (`config_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; # 新增首页推荐表数据 INSERT INTO tb_newbee_mall_index_config (config_name, config_type, goods_id, redirect_url, config_rank, is_deleted, create_time, create_user, update_time, update_user) VALUES ('热销商品 iPhone 12', 3, 10906, '##', 201, 0, '2021-03-08 18:55:49', 0, '2021-03-08 18:55:49', 0), ('热销商品 华为Mate40 Pro', 3, 10908, '##', 300, 0, '2021-03-08 18:55:49', 0, '2021-03-08 18:55:49', 0), ('新品上线 MackBook2021', 4, 10920, '##', 180, 0, '2021-03-08 18:55:49', 0, '2021-03-08 18:55:49', 0), ('新品上线 华为 P50 Pro', 4, 10921, '##', 160, 0, '2021-03-08 18:55:49', 0, '2021-03-08 18:55:49', 0), ('新品上线 Apple Watch', 4, 10919, '##', 101, 0, '2021-03-08 18:55:49', 0, '2021-03-08 18:55:49', 0), ('纪梵希高定香榭天鹅绒唇膏', 5, 10233, '##', 80, 0, '2021-03-08 18:55:49', 0, '2021-03-08 18:55:49', 0), ('P50 白色', 5, 10922, '##', 102, 0, '2021-03-08 18:55:49', 0, '2021-03-08 18:55:49', 0), ('free buds pro', 5, 10930, '##', 102, 0, '2021-03-08 18:55:49', 0, '2021-03-08 18:55:49', 0), ('iPhone 13', 5, 10916, '##', 101, 0, '2021-03-08 18:55:49', 0, '2021-03-08 18:55:49', 0), ('华为Mate40 Pro', 5, 10907, '##', 80, 0, '2021-03-08 18:55:49', 0, '2021-03-08 18:55:49', 0), ('MacBook Pro 2021', 5, 10920, '##', 100, 0, '2021-03-08 18:55:49', 0, '2021-03-08 18:55:49', 0), ('WATCH 3 Pro', 5, 10928, '##', 99, 0, '2021-03-08 18:55:49', 0, '2021-03-08 18:55:49', 0), ('塑料浴室座椅', 5, 10154, '##', 80, 0, '2021-03-08 18:55:49', 0, '2021-03-08 18:55:49', 0), ('华为 soundx', 5, 10929, '##', 100, 0, '2021-03-08 18:55:49', 0, '2021-03-08 18:55:49', 0), ('matepad pro', 5, 10906, '##', 0, 0, '2021-03-08 18:55:49', 0, '2021-03-08 18:55:49', 0), ('热销商品 P40', 3, 10902, '##', 200, 0, '2021-03-08 18:55:49', 0, '2021-03-08 18:55:49', 0), ('新品上线 华为 P50 Pocket', 4, 10925, '##', 200, 0, '2021-03-08 18:55:49', 0, '2021-03-08 18:55:49', 0), ('新品上线 华为Mate X Pro', 4, 10926, '##', 200, 0, '2021-03-08 18:55:49', 0, '2021-03-08 18:55:49', 0), ('华为 Mate 30 Pro', 5, 10927, '##', 101, 0, '2021-03-08 18:55:49', 0, '2021-03-08 18:55:49', 0), ('新品上线 iPhone13', 4, 10915, '##', 190, 0, '2021-03-08 18:55:49', 0, '2021-03-08 18:55:49', 0), ('Air Pods 第三代', 3, 10918, '##', 301, 0, '2021-03-08 18:55:49', 0, '2021-03-08 18:55:49', 0); DROP TABLE IF EXISTS `tb_newbee_mall_carousel`; # 创建轮播图表 CREATE TABLE `tb_newbee_mall_carousel` ( `carousel_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '首页轮播图主键id', `carousel_url` varchar(100) NOT NULL DEFAULT '' COMMENT '轮播图', `redirect_url` varchar(100) NOT NULL DEFAULT '''##''' COMMENT '点击后的跳转地址(默认不跳转)', `carousel_rank` int(11) NOT NULL DEFAULT '0' COMMENT '排序值(字段越大越靠前)', `is_deleted` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标识字段(0-未删除 1-已删除)', `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `create_user` int(11) NOT NULL DEFAULT '0' COMMENT '创建者id', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', `update_user` int(11) NOT NULL DEFAULT '0' COMMENT '修改者id', PRIMARY KEY (`carousel_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC; # 新增轮播图数据 INSERT INTO `tb_newbee_mall_carousel` (`carousel_id`, `carousel_url`, `redirect_url`, `carousel_rank`, `is_deleted`, `create_time`, `create_user`, `update_time`, `update_user`) VALUES (1,'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/banner2.jpg','##',200,1,'2021-08-23 17:50:45',0,'2021-11-10 00:23:01',0), (2,'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/banner1.png','https://juejin.cn/book/7085254558678515742',13,0,'2021-11-29 00:00:00',0,'2021-11-29 00:00:00',0), (3,'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/banner3.jpg','##',0,1,'2021-09-18 18:26:38',0,'2021-11-10 00:23:01',0), (5,'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/banner2.png','https://juejin.cn/book/7085254558678515742',0,0,'2021-11-29 00:00:00',0,'2021-11-29 00:00:00',0), (6,'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/banner1.png','##',101,1,'2021-09-19 23:37:40',0,'2021-11-07 00:15:52',0), (7,'https://newbee-mall.oss-cn-beijing.aliyuncs.com/images/banner2.png','##',99,1,'2021-09-19 23:37:58',0,'2021-10-22 00:15:01',0); ================================================ FILE: static-files/newbee_mall_cloud_user_db.sql ================================================ # 创建用户服务所需数据 CREATE DATABASE /*!32312 IF NOT EXISTS*/`newbee_mall_cloud_user_db` /*!40100 DEFAULT CHARACTER SET utf8 */; USE `newbee_mall_cloud_user_db`; DROP TABLE IF EXISTS `tb_newbee_mall_admin_user`; # 创建管理员用户表 CREATE TABLE `tb_newbee_mall_admin_user` ( `admin_user_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '管理员id', `login_user_name` varchar(50) NOT NULL COMMENT '管理员登陆名称', `login_password` varchar(50) NOT NULL COMMENT '管理员登陆密码', `nick_name` varchar(50) NOT NULL COMMENT '管理员显示昵称', `locked` tinyint(4) DEFAULT '0' COMMENT '是否锁定 0未锁定 1已锁定无法登陆', PRIMARY KEY (`admin_user_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC; # 新增管理员用户数据 INSERT INTO `tb_newbee_mall_admin_user` (`admin_user_id`, `login_user_name`, `login_password`, `nick_name`, `locked`) VALUES (1,'admin','e10adc3949ba59abbe56e057f20f883e','十三',0), (2,'newbee-admin1','e10adc3949ba59abbe56e057f20f883e','新蜂01',0), (3,'newbee-admin2','e10adc3949ba59abbe56e057f20f883e','新蜂02',0); DROP TABLE IF EXISTS `tb_newbee_mall_user`; # 创建商城用户表 CREATE TABLE `tb_newbee_mall_user` ( `user_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户主键id', `nick_name` varchar(50) NOT NULL DEFAULT '' COMMENT '用户昵称', `login_name` varchar(11) NOT NULL DEFAULT '' COMMENT '登陆名称(默认为手机号)', `password_md5` varchar(32) NOT NULL DEFAULT '' COMMENT 'MD5加密后的密码', `introduce_sign` varchar(100) NOT NULL DEFAULT '' COMMENT '个性签名', `is_deleted` tinyint(4) NOT NULL DEFAULT '0' COMMENT '注销标识字段(0-正常 1-已注销)', `locked_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '锁定标识字段(0-未锁定 1-已锁定)', `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '注册时间', PRIMARY KEY (`user_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC; # 新增商城用户数据 INSERT INTO `tb_newbee_mall_user` (`user_id`, `nick_name`, `login_name`, `password_md5`, `introduce_sign`, `is_deleted`, `locked_flag`, `create_time`) VALUES (1,'十三','13700002703','e10adc3949ba59abbe56e057f20f883e','我不怕千万人阻挡,只怕自己投降',0,0,'2022-05-22 08:44:57'), (6,'陈尼克','13711113333','e10adc3949ba59abbe56e057f20f883e','测试用户陈尼克',0,0,'2022-05-22 08:44:57');