• Java项目:SSM宠物商城带后台管理系统


    作者主页:夜未央5788

     简介:Java领域优质创作者、Java项目、学习资料、技术互助

    文末获取源码

    项目介绍

    该项目为前后台项目,分为普通用户与管理员两种角色,前台普通用户登录,后台管理员登录;

    用户角色包含以下功能:

    加入购物车,发表留言,提交订单,查看订单信息,会员注册,登录页面等功能。

    管理员角色包含以下功能:

    一级分类管理,宠物二级分类管理,宠物管理,宠物订单管理,用户管理,留言管理,管理员登录页面等功能。

    环境需要

    1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。
    2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;
    3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可
    4.硬件环境:windows 7/8/10 1G内存以上;或者 Mac OS;

    5.数据库:MySql 5.7版本;

    6.是否Maven项目:否;

    技术栈

    1. 后端:Spring+SpringMVC+Mybatis

    2. 前端:JSP+jQuery+Ajax

    使用说明

    1. 使用Navicat或者其它工具,在mysql中创建对应名称的数据库,并导入项目的sql文件;

    2. 使用IDEA/Eclipse/MyEclipse导入项目,Eclipse/MyEclipse导入时,若为maven项目请选择maven;

    若为maven项目,导入成功后请执行maven clean;maven install命令,然后运行;

    3. 将项目中jdbc.properties配置文件中的数据库配置改为自己的配置;

    4. 运行项目,在浏览器中输入http://localhost:8080/ 登录

    用户账号/密码: user/123456
    管理员账号/密码:admin/admin

    运行截图

    前台界面

     

     

     

     

     

     

    后台界面

     

     

     

     

     

    代码相关

    管理端控制器

    1. @Controller
    2. public class AdminController {
    3. @Autowired
    4. private UserService userService;
    5. @Autowired
    6. public CategoryService categoryService;
    7. @Autowired
    8. public CategorySecondService categorySecondService;
    9. @Autowired
    10. public ProductService productService;
    11. @Autowired
    12. private OrderService orderService;
    13. @Autowired
    14. private MessageService messageService;
    15. @RequestMapping("/admin/admin_findAll")
    16. public String admin_findAll(Model model, HttpServletRequest request) throws Exception {
    17. Adminuser adminuserLogin = (Adminuser) request.getSession().getAttribute("adminuserLogin");
    18. if(adminuserLogin==null){
    19. request.getSession().setAttribute("message","对不起您还没有登录");
    20. return "admin/index";
    21. }
    22. List userList = userService.admin_findAll();
    23. model.addAttribute("userList", userList);
    24. return "admin/user/list";
    25. }
    26. @RequestMapping("/admin/adminCategory_findAll")
    27. public String adminCategory_findAll(Model model, HttpServletRequest request)
    28. throws Exception {
    29. Adminuser adminuserLogin = (Adminuser) request.getSession().getAttribute("adminuserLogin");
    30. if(adminuserLogin==null){
    31. request.getSession().setAttribute("message","对不起您还没有登录");
    32. return "admin/index";
    33. }
    34. List categoryList = categoryService.adminbFindCategory();
    35. /*for (Category category : categoryList) {
    36. System.out.println(category.getCname());
    37. }*/
    38. model.addAttribute("categoryList", categoryList);
    39. return "admin/category/list";
    40. }
    41. @RequestMapping("/admin/adminCategory_add")
    42. public String adminCategory_add(Model model,HttpServletRequest request) throws Exception {
    43. Adminuser adminuserLogin = (Adminuser) request.getSession().getAttribute("adminuserLogin");
    44. if(adminuserLogin==null){
    45. request.getSession().setAttribute("message","对不起您还没有登录");
    46. return "admin/index";
    47. }
    48. // List categoryList = categoryService.adminbFindCategory();
    49. // model.addAttribute("categoryList", categoryList);
    50. return "admin/category/add";
    51. }
    52. @RequestMapping("/admin/adminCategory_save")
    53. public String adminCategory_save(@RequestParam String cname,HttpServletRequest request)
    54. throws Exception {
    55. Adminuser adminuserLogin = (Adminuser) request.getSession().getAttribute("adminuserLogin");
    56. if(adminuserLogin==null){
    57. request.getSession().setAttribute("message","对不起您还没有登录");
    58. return "admin/index";
    59. }
    60. Category addCategory = new Category();
    61. addCategory.setCname(cname);
    62. categoryService.addCategory(addCategory);
    63. return "redirect:/admin/adminCategory_findAll.action";
    64. }
    65. @RequestMapping("/admin/adminCategory_edit")
    66. public String adminCategory_delete(@RequestParam int cid, Model model,HttpServletRequest request)
    67. throws Exception {
    68. Adminuser adminuserLogin = (Adminuser) request.getSession().getAttribute("adminuserLogin");
    69. if(adminuserLogin==null){
    70. request.getSession().setAttribute("message","对不起您还没有登录");
    71. return "admin/index";
    72. }
    73. Category existCategory = categoryService.findCategory(cid);
    74. model.addAttribute("existCategory", existCategory);
    75. return "admin/category/edit";
    76. }
    77. @RequestMapping("/admin/adminCategory_update")
    78. public String adminCategory_update(@RequestParam int cid,
    79. @RequestParam String cname,HttpServletRequest request) {
    80. Adminuser adminuserLogin = (Adminuser) request.getSession().getAttribute("adminuserLogin");
    81. if(adminuserLogin==null){
    82. request.getSession().setAttribute("message","对不起您还没有登录");
    83. return "admin/index";
    84. }
    85. Category category = new Category();
    86. category.setCid(cid);
    87. category.setCname(cname);
    88. categoryService.adminCategory_update(category);
    89. return "redirect:/admin/adminCategory_findAll.action";
    90. }
    91. @RequestMapping("/admin/adminCategory_delete")
    92. public String adminCategory_delete(@RequestParam int cid,HttpServletRequest request) throws Exception {
    93. Adminuser adminuserLogin = (Adminuser) request.getSession().getAttribute("adminuserLogin");
    94. if(adminuserLogin==null){
    95. request.getSession().setAttribute("message","对不起您还没有登录");
    96. return "admin/index";
    97. }
    98. categorySecondService.adminCategorySecond_deleteByCid(cid);
    99. categoryService.deleteCategoryByCid(cid);
    100. return "redirect:/admin/adminCategory_findAll.action";
    101. }
    102. // admin 的二级分类的管理
    103. @RequestMapping("/admin/adminCategorySecond_findAllByPage")
    104. public String adminCategorySecond_findAllByPage(@RequestParam int page,Model model,HttpServletRequest request) {
    105. Adminuser adminuserLogin = (Adminuser) request.getSession().getAttribute("adminuserLogin");
    106. if(adminuserLogin==null){
    107. request.getSession().setAttribute("message","对不起您还没有登录");
    108. return "admin/index";
    109. }
    110. PageBean csPageBean = categorySecondService
    111. .adminCategorySecond_findAllByPage(page);
    112. /*List list = csPageBean.getList();
    113. for (Categorysecond categorysecond : list) {
    114. System.out.println(categorysecond.getCsname());
    115. }*/
    116. model.addAttribute("csPageBean", csPageBean);
    117. return "admin/categorysecond/list";
    118. }
    119. @RequestMapping("admin/adminCategorySecond_addPage")
    120. public String adminCategorySecond_addPage(Model model,HttpServletRequest request) throws Exception{
    121. Adminuser adminuserLogin = (Adminuser) request.getSession().getAttribute("adminuserLogin");
    122. if(adminuserLogin==null){
    123. request.getSession().setAttribute("message","对不起您还没有登录");
    124. return "admin/index";
    125. }
    126. List categoryList = categoryService.adminbFindCategory();
    127. model.addAttribute("categoryList", categoryList);
    128. return "admin/categorysecond/add";
    129. }
    130. @RequestMapping("admin/adminCategorySecond_save")
    131. public String adminCategorySecond_save(@RequestParam String csname,@RequestParam int cid,HttpServletRequest request) throws Exception{
    132. Adminuser adminuserLogin = (Adminuser) request.getSession().getAttribute("adminuserLogin");
    133. if(adminuserLogin==null){
    134. request.getSession().setAttribute("message","对不起您还没有登录");
    135. return "admin/index";
    136. }
    137. Categorysecond categorysecond = new Categorysecond();
    138. categorysecond.setCsname(csname);
    139. categorysecond.setCid(cid);
    140. categorySecondService.adminCategorySecond_save(categorysecond);
    141. return "redirect:/admin/adminCategorySecond_findAllByPage.action?page=1";
    142. }
    143. @RequestMapping("admin/adminCategorySecond_edit")
    144. public String adminCategorySecond_edit(@RequestParam int csid,Model model,HttpServletRequest request) throws Exception{
    145. Adminuser adminuserLogin = (Adminuser) request.getSession().getAttribute("adminuserLogin");
    146. if(adminuserLogin==null){
    147. request.getSession().setAttribute("message","对不起您还没有登录");
    148. return "admin/index";
    149. }
    150. Categorysecond findByCsid = categorySecondService.findByCsid(csid);
    151. model.addAttribute("findByCsid", findByCsid);
    152. return "admin/categorysecond/edit";
    153. }
    154. @RequestMapping("admin/adminCategorySecond_update")
    155. public String adminCategorySecond_update(@RequestParam String csname,@RequestParam int csid,HttpServletRequest request){
    156. Adminuser adminuserLogin = (Adminuser) request.getSession().getAttribute("adminuserLogin");
    157. if(adminuserLogin==null){
    158. request.getSession().setAttribute("message","对不起您还没有登录");
    159. return "admin/index";
    160. }
    161. Categorysecond categorysecond = new Categorysecond();
    162. categorysecond.setCsname(csname);
    163. categorysecond.setCsid(csid);
    164. categorySecondService.adminCategorySecond_update(categorysecond);
    165. return "redirect:/admin/adminCategorySecond_findAllByPage.action?page=1";
    166. }
    167. @RequestMapping("admin/adminCategorySecond_delete")
    168. public String adminCategorySecond_delete(@RequestParam int csid,HttpServletRequest request) throws Exception{
    169. Adminuser adminuserLogin = (Adminuser) request.getSession().getAttribute("adminuserLogin");
    170. if(adminuserLogin==null){
    171. request.getSession().setAttribute("message","对不起您还没有登录");
    172. return "admin/index";
    173. }
    174. categorySecondService.adminCategorySecond_delete(csid);
    175. return "redirect:/admin/adminCategorySecond_findAllByPage.action?page=1";
    176. }
    177. //admin的商品管理
    178. @RequestMapping("/admin/adminProduct_findAllByPage")
    179. public String adminProduct_findAllByPage(@RequestParam int page, Model model,HttpServletRequest request)
    180. throws Exception {
    181. Adminuser adminuserLogin = (Adminuser) request.getSession().getAttribute("adminuserLogin");
    182. if(adminuserLogin==null){
    183. request.getSession().setAttribute("message","对不起您还没有登录");
    184. return "admin/index";
    185. }
    186. PageBean allProPageBean = productService.findAllProduct(page);
    187. model.addAttribute("allProPageBean", allProPageBean);
    188. return "admin/product/list";
    189. }
    190. @RequestMapping("/admin/adminProduct_addPage")
    191. public String adminProduct_addPage(Model model,HttpServletRequest request) throws Exception {
    192. Adminuser adminuserLogin = (Adminuser) request.getSession().getAttribute("adminuserLogin");
    193. if(adminuserLogin==null){
    194. request.getSession().setAttribute("message","对不起您还没有登录");
    195. return "admin/index";
    196. }
    197. //查询出所有的二级分类
    198. List cslist = categorySecondService.findAll();
    199. /*for (Categorysecond categorysecond : cslist) {
    200. System.out.println(categorysecond.getCsname());
    201. }*/
    202. model.addAttribute("cslist", cslist);
    203. return "admin/product/add";
    204. }
    205. @RequestMapping("/admin/adminProduct_save")
    206. public String adminProduct_save(Product product,HttpServletRequest request,MultipartFile file) throws Exception {
    207. Adminuser adminuserLogin = (Adminuser) request.getSession().getAttribute("adminuserLogin");
    208. if(adminuserLogin==null){
    209. request.getSession().setAttribute("message","对不起您还没有登录");
    210. return "admin/index";
    211. }
    212. product.setPdate(new Date());
    213. // 上传图片
    214. if (file != null) {
    215. String path = request.getServletContext().getRealPath(
    216. "/products");
    217. String uploadFileName = file.getOriginalFilename();
    218. String fileName = UUIDUtiils.getUUID()+uploadFileName;
    219. File diskFile = new File(path + "//" + fileName);
    220. file.transferTo(diskFile);
    221. product.setImage("products/" + fileName);
    222. }
    223. System.out.println(product.getImage());
    224. productService.adminProduct_save(product);
    225. return "redirect:/admin/adminProduct_findAllByPage.action?page=1";
    226. }
    227. @RequestMapping("admin/adminProduct_deletecs")
    228. public String adminProduct_deletecs(@RequestParam int pid,HttpServletRequest request) throws Exception{
    229. Adminuser adminuserLogin = (Adminuser) request.getSession().getAttribute("adminuserLogin");
    230. if(adminuserLogin==null){
    231. request.getSession().setAttribute("message","对不起您还没有登录");
    232. return "admin/index";
    233. }
    234. productService.adminProduct_deletecs(pid);
    235. return "redirect:/admin/adminProduct_findAllByPage.action?page=1";
    236. }
    237. /**
    238. * 编辑商品
    239. *
    240. * @param pid
    241. * @param model
    242. * @param request
    243. * @return
    244. * @throws Exception
    245. */
    246. @RequestMapping("admin/adminProduct_edit")
    247. public String adminProduct_edit(@RequestParam int pid,Model model,HttpServletRequest request) throws Exception{
    248. Adminuser adminuserLogin = (Adminuser) request.getSession().getAttribute("adminuserLogin");
    249. if(adminuserLogin==null){
    250. request.getSession().setAttribute("message","对不起您还没有登录");
    251. return "admin/index";
    252. }
    253. Product product = productService.finbProductByPid(pid);
    254. model.addAttribute("findByPid", product);
    255. //查询出所有的二级分类
    256. List cslist = categorySecondService.findAll();
    257. model.addAttribute("cslist", cslist);
    258. return "admin/product/edit";
    259. }
    260. @RequestMapping("/admin/adminProduct_update")
    261. public String adminProduct_update(Product product,HttpServletRequest request,MultipartFile file) throws Exception {
    262. Adminuser adminuserLogin = (Adminuser) request.getSession().getAttribute("adminuserLogin");
    263. if(adminuserLogin==null){
    264. request.getSession().setAttribute("message","对不起您还没有登录");
    265. return "admin/index";
    266. }
    267. product.setPdate(new Date());
    268. // 上传图片
    269. if (file != null) {
    270. String path = request.getServletContext().getRealPath(
    271. "/products");
    272. String uploadFileName = file.getOriginalFilename();
    273. String fileName = UUIDUtiils.getUUID()+uploadFileName;
    274. File diskFile = new File(path + "//" + fileName);
    275. file.transferTo(diskFile);
    276. product.setImage("products/" + fileName);
    277. }
    278. productService.adminProduct_update(product);
    279. return "redirect:/admin/adminProduct_findAllByPage.action?page=1";
    280. }
    281. /** 订单管理模块 **/
    282. @RequestMapping("/admin/adminOrder_findAllByPage")
    283. public String adminOrder_findAllByPage(@RequestParam int page, Model model,HttpServletRequest request)
    284. throws Exception {
    285. Adminuser adminuserLogin = (Adminuser) request.getSession().getAttribute("adminuserLogin");
    286. if(adminuserLogin==null){
    287. request.getSession().setAttribute("message","对不起您还没有登录");
    288. return "admin/index";
    289. }
    290. PageBean allProPageBean = orderService.findAllOrderByStateAndPage(page);
    291. model.addAttribute("pageBean", allProPageBean);
    292. return "admin/order/list";
    293. }
    294. //adminOrder_findByState
    295. @RequestMapping("/admin/adminOrder_findByState")
    296. public String adminOrder_findByState(@RequestParam int page,@RequestParam int state, Model model,HttpServletRequest request)
    297. throws Exception {
    298. Adminuser adminuserLogin = (Adminuser) request.getSession().getAttribute("adminuserLogin");
    299. if(adminuserLogin==null){
    300. request.getSession().setAttribute("message","对不起您还没有登录");
    301. return "admin/index";
    302. }
    303. PageBean allProPageBean = orderService.findAllOrderByStateAndPage(state,page);
    304. model.addAttribute("pageBean", allProPageBean);
    305. return "admin/order/list";
    306. }
    307. //订单详情
    308. //adminOrder_findOrderItem
    309. @RequestMapping("/admin/adminOrder_findOrderItem")
    310. public String adminOrder_findOrderItem(@RequestParam int oid, Model model,HttpServletRequest request)
    311. throws Exception {
    312. Adminuser adminuserLogin = (Adminuser) request.getSession().getAttribute("adminuserLogin");
    313. if(adminuserLogin==null){
    314. request.getSession().setAttribute("message","对不起您还没有登录");
    315. return "admin/index";
    316. }
    317. Orders orderItems = orderService.findOrderByOid(oid);
    318. model.addAttribute("orderItems", orderItems);
    319. return "admin/order/list";
    320. }
    321. //更新订单状态
    322. @RequestMapping("/admin/adminOrder_updateState")
    323. public String adminOrder_updateState(@RequestParam int oid, @RequestParam int status, Model model,HttpServletRequest request)
    324. throws Exception {
    325. Adminuser adminuserLogin = (Adminuser) request.getSession().getAttribute("adminuserLogin");
    326. if(adminuserLogin==null){
    327. request.getSession().setAttribute("message","对不起您还没有登录");
    328. return "admin/index";
    329. }
    330. orderService.updateOrderStatus(oid, status);
    331. return "redirect:/admin/adminOrder_findAllByPage.action?page=1";
    332. }
    333. //后台留言管理
    334. @RequestMapping("/admin/adminMessage_findAllByPage")
    335. public String adminMessage_findAllByPage(@RequestParam int page, Model model,HttpServletRequest request)
    336. throws Exception {
    337. Adminuser adminuserLogin = (Adminuser) request.getSession().getAttribute("adminuserLogin");
    338. if(adminuserLogin==null){
    339. request.getSession().setAttribute("message","对不起您还没有登录");
    340. return "admin/index";
    341. }
    342. PageBean pageBean = messageService.findAllMessageByPage(page);
    343. model.addAttribute("pageBean", pageBean);
    344. return "admin/message/list";
    345. }
    346. @RequestMapping("/admin/adminMessage_delete")
    347. public String adminOrder_updateState(@RequestParam int messageid, Model model,HttpServletRequest request)
    348. throws Exception {
    349. Adminuser adminuserLogin = (Adminuser) request.getSession().getAttribute("adminuserLogin");
    350. if(adminuserLogin==null){
    351. request.getSession().setAttribute("message","对不起您还没有登录");
    352. return "admin/index";
    353. }
    354. messageService.deleteMessage(messageid);
    355. return "redirect:/admin/adminMessage_findAllByPage.action?page=1";
    356. }
    357. }

    购物车管理控制器

    1. @Controller
    2. public class cartController {
    3. @Autowired
    4. private ProductService productService;
    5. // 添加到购物车
    6. @RequestMapping("/addCart")
    7. public String addCart(HttpServletRequest request,@RequestParam int pid,@RequestParam int count ,Model model){
    8. Product product = productService.finbProductByPid(pid);
    9. // 存进一个购物项
    10. CartItem cartItem = new CartItem();
    11. cartItem.setCount(count);
    12. cartItem.setProduct(product);
    13. cartItem.setSubtotle(count*product.getShopPrice());
    14. // 存进购物车
    15. Cart cart=getCart(request);
    16. cart.addCart(cartItem);
    17. return "cart";
    18. }
    19. // 查看我的购物车
    20. @RequestMapping("/myCart")
    21. public String myCart(HttpServletRequest request,Model model){
    22. User loginUser = (User) request.getSession().getAttribute("loginUser");
    23. if (loginUser == null) {
    24. model.addAttribute("message","您还没有登录!");
    25. return "msg";
    26. }
    27. return "cart";
    28. }
    29. // 清空购物车
    30. @RequestMapping("/clearCart")
    31. public String clearCart(HttpServletRequest request){
    32. Cart cart=getCart(request);
    33. cart.clearCart();
    34. return "redirect:myCart.action";
    35. }
    36. // 删除某个购物项
    37. @RequestMapping("/delProFromCart")
    38. public String delProFromCart(@RequestParam int pid,HttpServletRequest request){
    39. Cart cart=getCart(request);
    40. cart.delProFromCart(pid);
    41. return "redirect:myCart.action";
    42. }
    43. public Cart getCart(HttpServletRequest request) {
    44. Cart cart = (Cart) request.getSession().getAttribute("cart");
    45. if (cart == null) {
    46. cart = new Cart();
    47. request.getSession().setAttribute("cart", cart);
    48. }
    49. return cart;
    50. }
    51. }

    订单管理控制器

    1. @Controller
    2. public class orderController {
    3. @Autowired
    4. private OrderService orderService;
    5. @RequestMapping("/toOrder")
    6. public String toOrder(HttpServletRequest request,Model model) throws Exception {
    7. Orders orders = new Orders();
    8. Cart cart = (Cart) request.getSession().getAttribute("cart");
    9. User loginUser = (User) request.getSession().getAttribute("loginUser");
    10. if(loginUser==null){
    11. model.addAttribute("message", "对不起您还没有登录");
    12. return "msg";
    13. }
    14. // 0表示没有付款、1表示已付款即将发货 2表示确认收货 3表示交易成功
    15. orders.setState(0);
    16. orders.setOrderTime(new Date());
    17. orders.setUid(loginUser.getUid());
    18. orders.setMoney(cart.getTotale());
    19. orderService.toOrder(orders);
    20. Map cartItems = cart.getCartItem();
    21. for (Entry entry : cartItems.entrySet()) {
    22. CartItem cartItem = entry.getValue();
    23. Orderitem orderitem = new Orderitem();
    24. orderitem.setProduct(cartItem.getProduct());
    25. orderitem.setCount(cartItem.getCount());
    26. orderitem.setPid(cartItem.getProduct().getPid());
    27. orderitem.setSubtotal(cartItem.getSubtotle());
    28. orderitem.setOid(orders.getOid());
    29. orders.getOiList().add(orderitem);
    30. orderService.toOrderItem(orderitem);
    31. }
    32. cart.clearCart();
    33. request.getSession().setAttribute("orders", orders);
    34. return "order";
    35. }
    36. // 为定单付款
    37. @RequestMapping("/payOrder")
    38. public String payOrder(Orders orders,@RequestParam String receiveInfo,@RequestParam String phoNum,@RequestParam String accepter) throws Exception {
    39. orders.setReceiveinfo(receiveInfo);
    40. orders.setPhonum(phoNum);
    41. orders.setAccepter(accepter);
    42. orderService.payOrder(orders);
    43. return "redirect:myOrder.action?page=1";
    44. }
    45. //payOrderAganin
    46. @RequestMapping("/payOrderAganin")
    47. public String payOrderAganin(@RequestParam int oid,HttpServletRequest request){
    48. Orders noPayOrder = orderService.findOrderByOid(oid);
    49. request.getSession().setAttribute("orders", noPayOrder);
    50. return "order";
    51. }
    52. // 查询myOrder
    53. @RequestMapping("/myOrder")
    54. public String myOrder(@RequestParam int page, Model model,
    55. HttpServletRequest request) throws Exception {
    56. User loginUser = (User) request.getSession().getAttribute("loginUser");
    57. PageBean pageBean = orderService.findOrderByUidAndPage(page,loginUser.getUid());
    58. model.addAttribute("pageBean", pageBean);
    59. return "orderList";
    60. }
    61. // 确认收货
    62. @RequestMapping("/updateState")
    63. public String updateState(@RequestParam int oid ) throws Exception {
    64. orderService.updateOrderStatus(oid, 3);
    65. return "redirect:myOrder.action?page=1";
    66. }
    67. }

    如果也想学习本系统,下面领取。关注并回复:137ssm

  • 相关阅读:
    微机原理:逻辑运算指令、移位指令
    建筑施工专业承包36项包括哪些
    特斯拉第三方应用开发指南(一)
    iPhone手机的备忘录怎么改变字体颜色 彩色字体备忘录
    linux-grep命令
    上周热点回顾(3.6-3.12)
    介绍Vue router的history模式以及如何配置history模式
    Day11--配置tabBar效果
    Seurat | 强烈建议收藏的单细胞分析标准流程(细胞周期的影响去除)(三)
    数字 IC 验证(1)UVM 验证技术
  • 原文地址:https://blog.csdn.net/hanyunlong1989/article/details/126539277