最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實戰(zhàn)網(wǎng)上電子書城的實現(xiàn)流程

 更新時間:2022年01月18日 17:14:52   作者:qq_1334611189  
讀萬卷書不如行萬里路,只學書上的理論是遠遠不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+JSP+maven+Mysql實現(xiàn)一個網(wǎng)上電子書城,大家可以在過程中查缺補漏,提升水平

項目描述: spring mvc +jsp實現(xiàn)的簡單書城項目,可以在支付寶沙箱內(nèi)實現(xiàn)支付

運行環(huán)境: jdk8+tomcat9+mysql+IntelliJ IDEA

項目技術: spring+spring mvc+mybatis+jsp+maven

 后臺管理員圖書管理代碼:

@Controller
@RequestMapping("/admin/book")
@RequiresPermissions("book-manage")
public class AdminBookController {
 
    @Autowired
    private IBookInfoService bookInfoService;
 
    @Autowired
    private BookDescMapper bookDescMapper;
 
    @Autowired
    private IStoreService storeService;
 
    @Value("${image.url.prefix}")
    private String urlPrefix;
 
    @RequestMapping("toAddition")
    @RequiresPermissions("book-add")
    public String toAddition() {
        return "admin/book/add";
    }
 
    /**
     * 添加書籍
     *
     */
    @RequestMapping("/addition")
    @RequiresPermissions("book-add")
    public String addBook(BookInfo bookInfo, String bookDesc, MultipartFile pictureFile, HttpServletRequest request) throws Exception {
 
        uploadPicture(bookInfo, pictureFile, request);
        bookInfoService.saveBook(bookInfo, bookDesc);
 
        return "redirect:/admin/book/list";
    }
 
    /**
     * 書籍列表
     *
     */
    @RequestMapping(value = "/list")
    @RequiresPermissions("book-query")
    public String bookList(@RequestParam(defaultValue = "", required = false) String keywords,
                           @RequestParam(value = "page", defaultValue = "1", required = false) int page,
                           HttpSession session,
                           Model model) {
        keywords = keywords.trim();
        Store store = (Store) session.getAttribute("loginStore");
 
        if (store != null) {
            PageInfo<BookInfo> books = bookInfoService.findBookListByCondition(keywords, 0, page, 10, store.getStoreId());
            model.addAttribute("bookPageInfo", books);
            model.addAttribute("keywords", keywords);
        } else {
            model.addAttribute("exception", "您請求的資源不存在");
            return "exception";
        }
 
        return "admin/book/list";
    }
 
    /**
     * 更新頁面回顯
     *
     * @param bookId
     * @param model
     * @return
     * @throws Exception
     */
    @RequestMapping("/echo")
    @RequiresPermissions("book-edit")
    public String echo(int bookId, Model model) throws BSException {
 
        BookInfo bookInfo = bookInfoService.adminFindById(bookId);
 
        BookDesc bookDesc = bookDescMapper.selectByPrimaryKey(bookInfo.getBookId());
 
        model.addAttribute("bookInfo", bookInfo);
 
        model.addAttribute("bookDesc", bookDesc);
 
        return "admin/book/edit";
    }
 
    @RequestMapping("/update")
    @RequiresPermissions("book-edit")
    public String updateBook(BookInfo bookInfo, String bookDesc, String keywords, MultipartFile pictureFile, HttpServletRequest request, RedirectAttributes ra) throws Exception {
        uploadPicture(bookInfo, pictureFile, request);
        BookInfo originBook = bookInfoService.findById(bookInfo.getBookId());
        bookInfoService.updateBook(bookInfo, bookDesc);
 
        //更新圖片后,刪除原來的圖片
        String realPath = request.getServletContext().getRealPath("/");
        File uploadPic = new File(realPath + originBook.getImageUrl());
        uploadPic.delete();
        //重定向到書籍列表
        ra.addAttribute("keywords", keywords);
        return "redirect:/admin/book/list";
    }
 
    @RequestMapping("/deletion/{bookId}")
    @RequiresPermissions("book-delete")
    public String deletion(@PathVariable("bookId") int bookId, String keywords, RedirectAttributes ra, HttpServletRequest request) throws BSException {
        BookInfo bookInfo = bookInfoService.findById(bookId);
        String realPath = request.getServletContext().getRealPath("/");
        File uploadPic = new File(realPath + bookInfo.getImageUrl());
        uploadPic.delete();
        bookInfoService.deleteBook(bookId);
        ra.addAttribute("keywords", keywords);
        return "redirect:/admin/book/list";
    }
 
    @RequestMapping("/shelf")
    @RequiresPermissions("book-shelf")
    public String bookOffShelf(int bookId, int isShelf, String keywords, RedirectAttributes ra) {
 
        bookInfoService.changeShelfStatus(bookId, isShelf);
        ra.addAttribute("keywords", keywords);
        return "redirect:/admin/book/list";
    }
 
    private void uploadPicture(BookInfo bookInfo, MultipartFile pictureFile, HttpServletRequest request) throws IOException {
        if (pictureFile != null) {
            if (!StringUtils.isEmpty(pictureFile.getOriginalFilename())) {
                String realPath = request.getServletContext().getRealPath("/" + urlPrefix);
                //原始文件名稱
                String pictureFileName = pictureFile.getOriginalFilename();
                //新文件名稱
                String newFileName = IDUtils.genShortUUID() + pictureFileName.substring(pictureFileName.lastIndexOf("."));
 
                //上傳圖片
                File uploadPic = new File(realPath + File.separator + newFileName);
 
                //向磁盤寫文件
                pictureFile.transferTo(uploadPic);
                bookInfo.setImageUrl(urlPrefix + File.separator + newFileName);
            }
        }
    }
 
}

書信息控制層:

@Controller
@RequestMapping("/book")
public class BookInfoController {
 
 
 
    @Autowired
    private IBookInfoService bookInfoService;
 
    @Autowired
    private BookDescMapper bookDescMapper;
 
    /**
     * 查詢某一本書籍詳情
     *
     * @param bookId
     * @param model
     * @return
     */
    @RequestMapping("/info/{bookId}")
    public String bookInfo(@PathVariable("bookId") Integer bookId, Model model) throws BSException {
        //查詢書籍
        BookInfo bookInfo = bookInfoService.findById(bookId);
        //查詢書籍推薦列表
        List<BookInfo> recommendBookList = bookInfoService.findBookListByCateId(bookInfo.getBookCategoryId(), 1, 5);
        //查詢書籍詳情
        BookDesc bookDesc = bookDescMapper.selectByPrimaryKey(bookId);
        //增加訪問量
        bookInfoService.addLookMount(bookInfo);
        Collections.shuffle(recommendBookList);
        model.addAttribute("bookInfo", bookInfo);
        model.addAttribute("bookDesc", bookDesc);
        model.addAttribute("recommendBookList", recommendBookList);
        return "book_info";
    }
 
 
    /**
     * 通過關鍵字和書籍分類搜索書籍列表
     *
     * @param keywords
     * @return
     */
    @RequestMapping("/list")
    public String bookSearchList(@RequestParam(defaultValue = "", required = false) String keywords,
                                 @RequestParam(defaultValue = "0", required = false) int cateId,//分類Id,默認為0,即不按照分類Id查
                                 @RequestParam(defaultValue = "1", required = false) int page,
                                 @RequestParam(defaultValue = "6", required = false) int pageSize,
                                 Model model) {
        keywords = keywords.trim();
        PageInfo<BookInfo> bookPageInfo = bookInfoService.findBookListByCondition(keywords, cateId, page, pageSize,0);//storeId為0,不按照商店Id查詢
 
        model.addAttribute("bookPageInfo", bookPageInfo);
 
        model.addAttribute("keywords", keywords);
 
        model.addAttribute("cateId", cateId);
 
        return "book_list";
    }
 
}

用戶管理控制層:

@Controller
@RequestMapping("/user")
public class UserController {
 
 
    @Autowired
    private IUserService userService;
 
    @Autowired
    private IMailService mailService;
 
    @Autowired
    private IStoreService storeService;
 
    @Value("${mail.fromMail.addr}")
    private String from;
 
    @Value("${my.ip}")
    private String ip;
 
    private final String USERNAME_PASSWORD_NOT_MATCH = "用戶名或密碼錯誤";
 
    private final String USERNAME_CANNOT_NULL = "用戶名不能為空";
 
    @RequestMapping("/login")
    public String login(@RequestParam(value = "username", required = false) String username,
                        @RequestParam(value = "password", required = false) String password,
                        HttpServletRequest request, Model model) {
        if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) {
            return "login";
        }
        //未認證的用戶
        Subject userSubject = SecurityUtils.getSubject();
        if (!userSubject.isAuthenticated()) {
            UsernamePasswordToken token = new UsernamePasswordToken(username, password);
 
            token.setRememberMe(false);//禁止記住我功能
            try {
 
                //登錄成功
                userSubject.login(token);
                User loginUser = (User) userSubject.getPrincipal();
                request.getSession().setAttribute("loginUser", loginUser);
                Store store = storeService.findStoreByUserId(loginUser.getUserId());
                request.getSession().setAttribute("loginStore", store);
 
 
                SavedRequest savedRequest = WebUtils.getSavedRequest(request);
                String url = "/";
                if (savedRequest != null) {
                    url = savedRequest.getRequestUrl();
                    if(url.contains(request.getContextPath())){
                        url = url.replace(request.getContextPath(),"");
                    }
                }
                if(StringUtils.isEmpty(url) || url.equals("/favicon.ico")){
                    url = "/";
                }
 
                return "redirect:" + url;
 
            } catch (UnknownAccountException | IncorrectCredentialsException uae) {
                model.addAttribute("loginMsg", USERNAME_PASSWORD_NOT_MATCH);
                return "login";
            } catch (LockedAccountException lae) {
                model.addAttribute("loginMsg", "賬戶已被凍結(jié)!");
                return "login";
            } catch (AuthenticationException ae) {
                model.addAttribute("loginMsg", "登錄失?。?);
                return "login";
            }
 
        } else {
            //用戶已經(jīng)登錄
            return "redirect:/index";
        }
 
    }
 
    @RequestMapping("/info")
    public String personInfo(){
        return "user_info";
    }
 
    /* @RequestMapping("/login1")
     public String login1(@RequestParam(value = "username", required = false) String username,
                          @RequestParam(value = "password", required = false) String password,
                          Model model, HttpServletRequest request) {
         if (StringUtils.isEmpty(username)) {
             model.addAttribute("loginMsg", USERNAME_CANNOT_NULL);
             return "login";
         }
         if (StringUtils.isEmpty(password)) {
             model.addAttribute("loginMsg", "密碼不能為空");
             return "login";
         }
         BSResult<User> bsResult = userService.login(username, password);
         //登錄校驗失敗
         if (bsResult.getData() == null) {
             model.addAttribute("loginMsg", bsResult.getMessage());
             return "login";
         }
         //登錄校驗成功,重定向到首頁
         User user = bsResult.getData();
         //置密碼為空
         user.setPassword("");
         request.getSession().setAttribute("user", user);
         return "redirect:/";
     }
     */
    //shiro框架幫我們注銷
    @RequestMapping("/logout")
    @CacheEvict(cacheNames="authorizationCache",allEntries = true)
    public String logout() {
        SecurityUtils.getSubject().logout();
        return "redirect:/page/login";
    }
 
    /**
     * 注冊 檢驗用戶名是否存在
     *
     * @param username
     * @return
     */
    @RequestMapping("/checkUserExist")
    @ResponseBody
    public BSResult checkUserExist(String username) {
        if (StringUtils.isEmpty(username)) {
            return BSResultUtil.build(200, USERNAME_CANNOT_NULL, false);
        }
 
        return userService.checkUserExistByUsername(username);
    }
 
    /**
     * 注冊,發(fā)激活郵箱
     *
     * @param user
     * @return
     */
    @RequestMapping("/register")
    public String register(User user, Model model) {
 
        BSResult isExist = checkUserExist(user.getUsername());
 
        //盡管前臺頁面已經(jīng)用ajax判斷用戶名是否存在,
        // 為了防止用戶不是點擊前臺按鈕提交表單造成的錯誤,后臺也需要判斷
        if ((Boolean) isExist.getData()) {
        	user.setActive("1");
            BSResult bsResult = userService.saveUser(user);
            //獲得未激活的用戶
            User userNotActive = (User) bsResult.getData();
          /*  try {
                mailService.sendHtmlMail(user.getEmail(), "<dd書城>---用戶激活---",
                        "<html><body><a href='http://"+ip+"/user/active?activeCode=" + userNotActive.getCode() + "'>親愛的" + user.getUsername() +
                                ",請您點擊此鏈接前往激活</a></body></html>");
            } catch (Exception e) {
                e.printStackTrace();
                model.addAttribute("registerError", "發(fā)送郵件異常!請檢查您輸入的郵箱地址是否正確。");
                return "fail";
            }*/
            model.addAttribute("username", user.getUsername());
            return "register_success";
        } else {
 
            //用戶名已經(jīng)存在,不能注冊
            model.addAttribute("registerError", isExist.getMessage());
            return "register";
        }
 
    }
 
    @RequestMapping("/active")
    public String activeUser(String activeCode, Model model) {
        BSResult bsResult = userService.activeUser(activeCode);
        if (!StringUtils.isEmpty(bsResult.getData())) {
            model.addAttribute("username", bsResult.getData());
            return "active_success";
        } else {
            model.addAttribute("failMessage", bsResult.getMessage());
            return "fail";
        }
    }
 
    @RequestMapping("/update")
    @ResponseBody
    public BSResult updateUser(User user, HttpSession session){
        User loginUser = (User) session.getAttribute("loginUser");
        loginUser.setNickname(user.getNickname());
        loginUser.setLocation(user.getLocation());
        loginUser.setDetailAddress(user.getDetailAddress());
        loginUser.setGender(user.getGender());
        loginUser.setUpdated(new Date());
        loginUser.setPhone(user.getPhone());
        loginUser.setIdentity(user.getIdentity());
        loginUser.setPhone(user.getPhone());
        BSResult bsResult = userService.updateUser(loginUser);
        session.setAttribute("loginUser", loginUser);
        return bsResult;
    }
 
    @RequestMapping("/password/{userId}")
    @ResponseBody
    public BSResult changePassword(@PathVariable("userId") int userId,String oldPassword,String newPassword){
        if(StringUtils.isEmpty(oldPassword) || StringUtils.isEmpty(newPassword)){
            return BSResultUtil.build(400, "密碼不能為空");
        }
        return userService.compareAndChange(userId,oldPassword,newPassword);
    }
 
}

到此這篇關于Java實戰(zhàn)網(wǎng)上電子書城的實現(xiàn)流程的文章就介紹到這了,更多相關Java 網(wǎng)上電子書城內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java開發(fā)之HashMap的使用和遍歷

    Java開發(fā)之HashMap的使用和遍歷

    這篇文章主要介紹了Java開發(fā)之HashMap的使用和遍歷的相關資料,這里提供一個HashMap的簡單實例并結(jié)合List使用,需要的朋友可以參考下
    2017-08-08
  • Linux實時查看Java接口數(shù)據(jù)的案例方法

    Linux實時查看Java接口數(shù)據(jù)的案例方法

    在Linux系統(tǒng)中實時查看Java接口數(shù)據(jù)通常涉幾個步驟,通過示例代碼說明如何使用Python的requests庫和Linux的cron作業(yè)來定期查詢Java應用程序的接口并打印結(jié)果,感興趣的朋友跟隨小編一起看看吧
    2024-06-06
  • java實現(xiàn)隨機森林RandomForest的示例代碼

    java實現(xiàn)隨機森林RandomForest的示例代碼

    本篇文章主要介紹了java實現(xiàn)隨機森林RandomForest的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • JSON.toJSONString()空字段不忽略修改的問題

    JSON.toJSONString()空字段不忽略修改的問題

    這篇文章主要介紹了JSON.toJSONString()空字段不忽略修改的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java必踩的坑之方法中形參、實參傳遞

    Java必踩的坑之方法中形參、實參傳遞

    這篇文章主要給大家介紹了關于Java必踩的坑之方法中形參、實參傳遞的相關資料,以及Java 形參和實參的區(qū)別,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-03-03
  • Java中的數(shù)組使用詳解及練習

    Java中的數(shù)組使用詳解及練習

    數(shù)組是Java程序中最常見的一種數(shù)據(jù)結(jié)構(gòu),它能夠?qū)⑾嗤愋偷臄?shù)據(jù)用一個標識符封裝到一起,構(gòu)成一個對象序列或基本數(shù)據(jù)類型,這篇文章主要給大家介紹了關于Java中數(shù)組使用詳解及練習的相關資料,需要的朋友可以參考下
    2024-03-03
  • SpringBoot中web模版數(shù)據(jù)渲染展示的案例詳解

    SpringBoot中web模版數(shù)據(jù)渲染展示的案例詳解

    憑借 Spring Framework 的模塊、與你最喜歡的工具的大量集成以及插入你自己的功能的能力,Thymeleaf 是現(xiàn)代 HTML5 JVM Web 開發(fā)的理想選擇——盡管它還有更多功能,本文重點給大家介紹SpringBoot中web模版數(shù)據(jù)渲染展示,需要的朋友可以參考下
    2022-01-01
  • Java排序?qū)崿F(xiàn)的心得分享

    Java排序?qū)崿F(xiàn)的心得分享

    這篇文章主要介紹了Java排序?qū)崿F(xiàn)的心得,有需要的朋友可以參考一下
    2014-01-01
  • 因BigDecimal類型數(shù)據(jù)引出的問題詳析

    因BigDecimal類型數(shù)據(jù)引出的問題詳析

    Java在java.math包中提供的API類BigDecimal,用來對超過16位有效位的數(shù)進行精確的運算,下面這篇文章主要給大家介紹了因BigDecimal類型數(shù)據(jù)引出的問題的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2018-08-08
  • spring Retryable注解實現(xiàn)重試詳解

    spring Retryable注解實現(xiàn)重試詳解

    這篇文章主要介紹了spring Retryable注解實現(xiàn)重試詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09

最新評論

离岛区| 沾益县| 鸡泽县| 时尚| 上杭县| 加查县| 永修县| 赣州市| 嘉鱼县| 菏泽市| 芦溪县| 宁远县| 崇州市| 平阳县| 逊克县| 宝鸡市| 定南县| 昆明市| 宁远县| 北京市| 勐海县| 龙江县| 民勤县| 始兴县| 凤阳县| 榆社县| 玉树县| 湖北省| 洞口县| 西丰县| 甘泉县| 崇明县| 咸阳市| 讷河市| 浠水县| 商南县| 灵石县| 长沙市| 伊宁县| 长垣县| 额济纳旗|