<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
專案編號:BS-XX-098
本系統前臺面向的使用者是客戶,客戶可以進行預約、瀏覽醫院釋出的文章、進入醫院商城為寵物購物、如有疑問可以向官方留言、還可以檢視關於自己的所有記錄資訊,如:看病記錄、預約記錄、疫苗注射記錄等。後臺面向的使用者是醫院人員,系統管理員擁有最高許可權,可以對所有資料進行管理,為所有的角色分配許可權以及建立角色;業務管理員的許可權主要是對一些常用資料的維護;醫生可以接受客戶釋出的預約醫生的預約單以及處理屬於自己的預約單,回答客戶的問診;美容師可以接受客戶釋出的預約美容的預約單以及處理屬於自己的預約單。
本專案核心技術採用Spring Boot+Mybatis;開發工具idea;資料庫MySQL5.6;模版引擎採用的是Thymeleaf;安全框架採用Shiro,實現了完整許可權系統,Controller方法採用Shiro註解來實現有效的許可權控制;前臺介面採用了Bootstrap技術;後臺介面採用了EasyUI技術;
#### 未註冊使用者
非註冊使用者(即遊客身份)進入醫院官網首頁,可以瀏覽關於醫院的宣傳以及醫院釋出的文章,進入醫院商城瀏覽正在發售的商品,搜尋已釋出的文章和商品,註冊以及登入。
#### 已註冊使用者
註冊使用者可以修改個人資訊和寵物資訊,釋出預約單(預約醫生和美容師),在醫院的商城購物,收藏商品,給官方留言,檢視與自己相關的記錄資訊,如:病例記錄、預約記錄、問診記錄、訂單記錄等,登出退出系統。
#### 醫生
醫生可以檢視並接受客戶釋出的未被處理的預約醫生的預約單,結束屬於自己的預約單,回覆客戶的網上問診以及檢視自己回覆的問診記錄,修改個人密碼,安全退出系統。
#### 美容師
美容師可以檢視並接受客戶釋出的未被處理的預約美容師的預約單,結束屬於自己的預約單。
#### 業務管理員
業務管理員具有進貨管理(包括進貨入庫、退貨出庫、進貨單據查詢、退貨單據查詢以及當前庫存查詢)、銷售管理(包括銷售出庫、客戶退貨入庫、銷售單據查詢、退貨單據查詢)、庫存管理(包括商品報損、商品報溢、庫存報警、報損報溢記錄查詢)、檢視統計資料(供應商進退貨單統計、客戶進退貨單統計、按日統計銷售利潤、按月統計銷售利潤)、供應商管理、客戶管理、商品管理、期初庫存管理、前臺輪播圖管理、裝置型別管理、裝置管理、裝置使用管理、裝置使用記錄管理、文章型別管理、文章管理、客戶留言管理、醫院用品管理、醫院用品出入庫管理、醫院用品出入庫記錄管理、客戶訊息管理、客戶訂單處理、客戶預約單管理、客戶問診記錄管理、病歷單管理、化驗記錄管理、疫苗注射記錄管理、客戶回訪記錄管理、寄養記錄管理、修改密碼、安全退出系統。
#### 系統管理員
系統管理員除了具備業務管理員的所有許可權外,還有建立角色並賦予角色許可權的功能,還可以檢視系統操作紀錄檔。
#### 系統自身
系統每天0點自動建立明天的分別屬於各個醫生或美容師各個時間段的空預約單(未被客戶接受的預約單)、每分鐘自動篩選出5分鐘後過期的空預約單並從資料庫刪除、每分鐘自動篩選和取消客戶提交的超過一天未支付的訂單並釋放庫存、每天凌晨1點自動將釋出日期超過3個月的商品的"新品"標籤去掉、醫院上班後(8點)系統自動給當天有預約的客戶傳送提醒訊息
下面展示一下系統的整體功能:
前端首頁
商城首頁
前端使用者登陸註冊
個人中心
個人訂單
預約醫生
客戶服務功能
新增到購物車
提交訂單
支付訂單
新聞文章
後臺管理功能
進貨管理
銷售管理
庫存管理
統計報表
基礎資料管理
預約單管理
看病服務模組
系統管理模組
具體的角色就不再一一展示了,不同的使用者可以根據後臺設定不同的操作許可權,整體系統的功能非常強大,幾乎包含了寵物商城、寵物看病就醫、寵物進銷存等管理的所有功能模組,可以根據自己的需求選擇一部分功能進行使用!
比如醫生登陸後:
系統工程結構:
部分核心程式碼:
package com.ledao.controller; import com.ledao.entity.Article; import com.ledao.service.ArticleService; import com.ledao.service.ArticleTypeService; import com.ledao.util.PageUtil; import com.ledao.util.StringUtil; import org.springframework.stereotype.Controller; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.ModelAndView; import javax.annotation.Resource; import javax.validation.Valid; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @author 指南針 * @company * @create 2022-01-27 19:04 */ @Controller @RequestMapping("/article") public class ArticleController { @Resource private ArticleService articleService; @Resource private ArticleTypeService articleTypeService; @RequestMapping("/search") public ModelAndView search(@Valid Article searchArticle, BindingResult bindingResult) { ModelAndView mav = new ModelAndView(); if (bindingResult.hasErrors()) { mav.addObject("error", bindingResult.getFieldError().getDefaultMessage()); mav.addObject("title", "首頁"); mav.addObject("mainPage", "page/indexFirst"); } else { Map<String, Object> map = new HashMap<>(16); map.put("title", StringUtil.formatLike(searchArticle.getTitle())); List<Article> articleList = articleService.list(map); mav.addObject("articleList", articleList); mav.addObject("title", "關於(" + searchArticle.getTitle() + ")的文章"); mav.addObject("mainPage", "page/article/articleResult"); mav.addObject("mainPageKey", "#b"); mav.addObject("searchArticle", searchArticle); mav.addObject("total", articleList.size()); } mav.setViewName("index"); return mav; } /** * 分頁分類查詢文章資訊 * * @param page * @param typeId * @return */ @RequestMapping("/list/{id}") public ModelAndView list(@PathVariable(value = "id", required = false) Integer page, @RequestParam(value = "typeId", required = false) Integer typeId) { ModelAndView mav = new ModelAndView(); Map<String, Object> map = new HashMap<>(16); String typeName = articleTypeService.findById(typeId).getName(); map.put("typeId", typeId); int pageSize = 7; map.put("start", (page - 1) * pageSize); map.put("size", pageSize); List<Article> articleList = articleService.list(map); Long total = articleService.getCount(map); mav.addObject("typeName", typeName); mav.addObject("title", "文章列表(" + typeName + ")"); mav.addObject("articleList", articleList); mav.addObject("total", total); mav.addObject("pageCode", PageUtil.genPagination("/article/list", total, page, pageSize, typeId)); mav.addObject("mainPage", "page/article/articleList"); mav.addObject("mainPageKey", "#b"); mav.setViewName("index"); return mav; } /** * 根據id獲取文章詳細資訊 * * @param id * @return */ @RequestMapping("/{id}") public ModelAndView view(@PathVariable(value = "id", required = false) Integer id) { ModelAndView mav = new ModelAndView(); Article article = articleService.findById(id); article.setClick(article.getClick()+1); articleService.update(article); mav.addObject("typeName", articleTypeService.findById(article.getTypeId()).getName()); mav.addObject("article", article); mav.addObject("title", article.getTitle()); mav.addObject("pageCode", this.getLastAndNextArticle(articleService.getLast(id), articleService.getNext(id))); mav.addObject("mainPage", "page/article/articleView"); mav.addObject("mainPageKey", "#b"); mav.setViewName("index"); return mav; } /** * 獲取上一篇文章和下一篇文章 * * @param lastArticle * @param nextArticle * @return */ private String getLastAndNextArticle(Article lastArticle, Article nextArticle) { StringBuffer pageCode = new StringBuffer(); if (lastArticle == null || lastArticle.getId() == null) { pageCode.append("<p>上一篇:沒有了</p>"); } else { pageCode.append("<p>上一篇:<a href='/article/" + lastArticle.getId() + "'>" + lastArticle.getTitle() + "</a></p>"); } if (nextArticle == null || nextArticle.getId() == null) { pageCode.append("<p>下一篇:沒有了</p>"); } else { pageCode.append("<p>下一篇:<a href='/article/" + nextArticle.getId() + "'>" + nextArticle.getTitle() + "</a></p>"); } return pageCode.toString(); } }
package com.ledao.controller; import com.ledao.entity.*; import com.ledao.service.*; import com.ledao.util.PageUtil; import com.ledao.util.StringUtil; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; import javax.annotation.Resource; import javax.servlet.http.HttpSession; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 前臺客戶商品評論Controller層 * * @author 指南針 * @company * @create 2022-05-27 23:04 */ @Controller @RequestMapping("/comment") public class CommentController { @Resource private CommentService commentService; @Resource private GoodsService goodsService; @Resource private SaleListGoodsService saleListGoodsService; @Resource private ReturnListGoodsService returnListGoodsService; @Resource private GoodsTypeService goodsTypeService; @Resource private CustomerService customerService; @Resource private FavoriteService favoriteService; /** * 我的化驗記錄 * * @param page * @param session * @return */ @RequestMapping("/myComment/list/{id}") public ModelAndView myComment(@PathVariable(value = "id", required = false) Integer page, HttpSession session) { ModelAndView mav = new ModelAndView(); Map<String, Object> map = new HashMap<>(16); int pageSize = 4; map.put("start", (page - 1) * pageSize); map.put("size", pageSize); Customer currentCustomer = (Customer) session.getAttribute("currentCustomer"); map.put("customerId", currentCustomer.getId()); List<Comment> commentList = commentService.list(map); for (Comment comment : commentList) { comment.setGoods(goodsService.findById(comment.getGoodsId())); comment.setSaleListGoods(saleListGoodsService.findById(comment.getSaleListGoodsId())); comment.setSaleList(comment.getSaleListGoods().getSaleList()); } Long total = commentService.getCount(map); mav.addObject("commentList", commentList); mav.addObject("total", total); mav.addObject("pageCode", PageUtil.genPagination2("/comment/myComment/list", total, page, pageSize)); mav.addObject("title", "我的評論"); mav.addObject("mainPage", "page/comment/myComment"); mav.addObject("mainPageKey", "#b"); mav.setViewName("index"); return mav; } /** * 跳轉到客戶評價商品介面 * * @param saleListGoodsId * @return */ @RequestMapping("/commentPage") public ModelAndView commentPage(Integer saleListGoodsId) { ModelAndView mav = new ModelAndView(); SaleListGoods saleListGoods = saleListGoodsService.findById(saleListGoodsId); Goods goods = goodsService.findById(saleListGoods.getGoodsId()); mav.addObject("saleListGoods", saleListGoods); mav.addObject("goods", goods); mav.addObject("title", "評價商品"); mav.addObject("mainPage", "page/comment/commentPage"); mav.addObject("mainPageKey", "#b"); mav.setViewName("index"); return mav; } /** * 新增商品評價 * * @param comment * @return */ @RequestMapping("/save") public String save(Comment comment, HttpSession session) { Customer currentCustomer = (Customer) session.getAttribute("currentCustomer"); comment.setCustomerId(currentCustomer.getId()); commentService.add(comment); SaleListGoods saleListGoods = saleListGoodsService.findById(comment.getSaleListGoodsId()); saleListGoods.setStatus(1); saleListGoodsService.update(saleListGoods); return "redirect:/comment/myComment/list/1"; } /** * 檢視評價詳情 * * @param commentId * @return */ @RequestMapping("/commentDetails") public ModelAndView commentDetails(Integer commentId) { Comment comment = commentService.findById(commentId); comment.setGoods(goodsService.findById(comment.getGoodsId())); ModelAndView mav = new ModelAndView(); mav.addObject("comment", comment); mav.addObject("title", "檢視評價詳情"); mav.addObject("mainPage", "page/comment/commentDetails"); mav.addObject("mainPageKey", "#b"); mav.setViewName("index"); return mav; } @RequestMapping("/customerComment/list/{id}") public ModelAndView customerComment(@PathVariable(value = "id", required = false) Integer page, Integer goodsId, HttpSession session) { ModelAndView mav = new ModelAndView(); Map<String, Object> map = new HashMap<>(16); int pageSize = 4; map.put("start", (page - 1) * pageSize); map.put("size", pageSize); map.put("goodsId", goodsId); List<Comment> commentList = commentService.list(map); for (Comment comment : commentList) { comment.setCustomer(customerService.findById(comment.getCustomerId())); } Long total = commentService.getCount(map); List<GoodsType> goodsTypeList = goodsTypeService.findByParentId(1); for (GoodsType goodsType : goodsTypeList) { goodsType.setSmallGoodsTypeList(goodsTypeService.findByParentId(goodsType.getId())); } Map<String, Object> map2 = new HashMap<>(16); map.put("typeId", goodsService.findById(goodsId).getType().getId()); List<Goods> goodsList = goodsService.list(map2); Collections.shuffle(goodsList); goodsList.remove(goodsService.findById(goodsId)); Goods goods = goodsService.findById(goodsId); this.setGoodsFavorite(goods,session); mav.addObject("allSaleTotal", saleListGoodsService.getSaleCount(goods.getId()) - returnListGoodsService.getReturnCount(goods.getId())); mav.addObject("goodsTypeList", goodsTypeList); mav.addObject("goods", goods); mav.addObject("commentList", commentList); mav.addObject("recommendGoodsList", goodsList); mav.addObject("total", total); mav.addObject("pageCode", PageUtil.genPagination3("/comment/customerComment/list", total, page, pageSize,goodsId)); mav.addObject("title", "客戶評價"); mav.addObject("mainPage", "page/comment/customerComment"); mav.addObject("mainPageKey", "#b"); mav.setViewName("index"); return mav; } /** * 給商品設定是否已收藏標籤(0否,1是) * * @param goods */ private void setGoodsFavorite(Goods goods, HttpSession session) { Map<String, Object> map = new HashMap<>(16); map.put("customer", session.getAttribute("currentCustomer")); List<Favorite> favoriteList = favoriteService.list(map); for (Favorite favorite : favoriteList) { if (goods.getId().equals(favorite.getGoods().getId())) { goods.setIsFavorite(1); } } } }
package com.ledao.controller; import com.ledao.entity.Customer; import com.ledao.entity.Log; import com.ledao.entity.Pet; import com.ledao.service.CustomerService; import com.ledao.service.LogService; import com.ledao.service.PetService; import com.ledao.util.DateUtil; import com.ledao.util.PageUtil; import org.apache.commons.io.FileUtils; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.servlet.ModelAndView; import javax.annotation.Resource; import javax.servlet.http.HttpSession; import javax.validation.Valid; import java.io.File; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 前臺客戶Controller層 * * @author 指南針 * @company * @create 2022-01-30 14:57 */ @Controller @RequestMapping("/customer") public class CustomerController { @Value("${customerImageFilePath}") private String customerImageFilePath; @Resource private CustomerService customerService; @Resource private PetService petService; /** * 新增或者修改客戶資訊 * * @param customer * @return */ @RequestMapping("/save") public ModelAndView save(Customer customer, @RequestParam("customerImage") MultipartFile file, HttpSession session) throws Exception { if (!file.isEmpty()) { if (customer.getId() != null) { FileUtils.deleteQuietly(new File(customerImageFilePath + customerService.findById(customer.getId()).getImageName())); } // 獲取上傳的檔名 String fileName = file.getOriginalFilename(); // 獲取檔案的字尾 String suffixName = fileName.substring(fileName.lastIndexOf(".")); String newFileName = DateUtil.getCurrentDateStr2() + suffixName; FileUtils.copyInputStreamToFile(file.getInputStream(), new File(customerImageFilePath + newFileName)); customer.setImageName(newFileName); } if (customer.getId() == null) { customerService.add(customer); ModelAndView mav = new ModelAndView("redirect:/login"); mav.addObject("successRegister", true); mav.addObject("title", "使用者登入"); mav.addObject("mainPage", "page/login"); mav.addObject("mainPageKey", "#b"); return mav; } else { customerService.update(customer); ModelAndView mav = new ModelAndView("redirect:/customer/personalCenter"); mav.addObject("successModify", true); mav.addObject("title", "個人中心"); mav.addObject("mainPage", "page/customer/personalCenterFirst"); customer.setImageName(customerService.findById(customer.getId()).getImageName()); session.setAttribute("currentCustomer", customer); mav.addObject("mainPageKey", "#b"); return mav; } } /** * 客戶登入 * * @param customer * @param bindingResult * @param session * @return */ @RequestMapping("/login") public ModelAndView login(@Valid Customer customer, BindingResult bindingResult, HttpSession session) { ModelAndView mav = new ModelAndView(); if (bindingResult.hasErrors()) { mav.addObject("customer", customer); mav.addObject("error", bindingResult.getFieldError().getDefaultMessage()); mav.addObject("title", "使用者登入"); mav.addObject("mainPage", "page/login"); } else { List<Customer> customerList = customerService.findByUserName(customer.getUserName()); if (customerList.size() != 0) { Customer currentCustomer = customerService.findByUserName(customer.getUserName()).get(0); if (currentCustomer.getPassword().equals(customer.getPassword())) { session.setAttribute("currentCustomer", currentCustomer); mav.addObject("successLogin", true); mav.addObject("title", "首頁"); mav.addObject("mainPage", "page/indexFirst"); } else { mav.addObject("successLogin", false); mav.addObject("title", "使用者登入"); mav.addObject("mainPage", "page/login"); } } else { mav.addObject("successLogin", false); mav.addObject("title", "使用者登入"); mav.addObject("mainPage", "page/login"); } } mav.addObject("mainPageKey", "#b"); mav.setViewName("index"); return mav; } /** * 退出登入返回的頁面 * * @param session * @return */ @RequestMapping("/logout") public ModelAndView logout(HttpSession session) { session.invalidate(); ModelAndView mav = new ModelAndView(""); mav.addObject("title", "使用者登入"); mav.addObject("mainPage", "page/indexFirst"); mav.addObject("mainPageKey", "#b"); mav.setViewName("index"); return mav; } /** * 跳轉到修改個人中心頁面 * * @return */ @RequestMapping("/personalCenter") public ModelAndView personalCenter() { ModelAndView mav = new ModelAndView(); mav.addObject("title", "個人中心"); mav.addObject("mainPage", "page/customer/personalCenterFirst"); mav.addObject("mainPageKey", "#b"); mav.setViewName("index"); return mav; } /** * 跳轉到修改個人資訊頁面 * * @return */ @RequestMapping("/personalCenter/ModifyMessage") public ModelAndView personalCenterModifyMessage() { ModelAndView mav = new ModelAndView(); mav.addObject("title", "修改個人資訊"); mav.addObject("mainPage", "page/customer/personalCenterModifyMessage"); mav.addObject("mainPageKey", "#b"); mav.setViewName("index"); return mav; } /** * 客戶註冊時判斷使用者名稱是否已經存在 * * @param userName * @return */ @ResponseBody @RequestMapping("/existUserWithUserName") public Map<String, Object> existUserWithUserName(String userName) { Map<String, Object> resultMap = new HashMap<>(16); Long count = customerService.getCountByUserName(userName); if (count != 0) { resultMap.put("success", true); } else { resultMap.put("success", false); } return resultMap; } /** * 檢視我的寵物 * * @return */ @RequestMapping("/myPet/list/{id}") public ModelAndView myPet(@PathVariable(value = "id", required = false) Integer page, HttpSession session) { ModelAndView mav = new ModelAndView(); Map<String, Object> map = new HashMap<>(16); int pageSize = 3; map.put("start", (page - 1) * pageSize); map.put("size", pageSize); map.put("customer", session.getAttribute("currentCustomer")); List<Pet> petList = petService.list(map); Long total = petService.getCount(map); mav.addObject("petList", petList); mav.addObject("total", total); mav.addObject("pageCode", PageUtil.genPagination2("/customer/myPet/list", total, page, pageSize)); mav.addObject("title", "我的寵物"); mav.addObject("mainPage", "page/customer/myPet"); mav.addObject("mainPageKey", "#b"); mav.setViewName("index"); return mav; } /** * 新增寵物資訊頁面 * * @return */ @RequestMapping("/petAdd") public ModelAndView petAdd() { ModelAndView mav = new ModelAndView(); mav.addObject("title", "新增寵物資訊"); mav.addObject("mainPage", "page/customer/petAdd"); mav.addObject("mainPageKey", "#b"); mav.setViewName("index"); return mav; } /** * 修改寵物資訊頁面 * * @param petId * @return */ @RequestMapping("/petModify") public ModelAndView petModify(Integer petId) { Pet pet = petService.findById(petId); ModelAndView mav = new ModelAndView(); mav.addObject("pet", pet); mav.addObject("title", "修改寵物資訊"); mav.addObject("mainPage", "page/customer/petModify"); mav.addObject("mainPageKey", "#b"); mav.setViewName("index"); return mav; } /** * 檢視寵物資訊頁面 * * @param petId * @return */ @RequestMapping("/petDetails") public ModelAndView petDetails(Integer petId) { Pet pet = petService.findById(petId); ModelAndView mav = new ModelAndView(); mav.addObject("pet", pet); mav.addObject("title", "檢視寵物資訊"); mav.addObject("mainPage", "page/customer/petDetails"); mav.addObject("mainPageKey", "#b"); mav.setViewName("index"); return mav; } }
到此這篇關於Springboot範例講解實現寵物醫院管理系統流程的文章就介紹到這了,更多相關Springboot寵物醫院管理系統內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45