diff --git a/BackEnd/Library/src/main/java/com/innovature/Library/controller/BorrowController.java b/BackEnd/Library/src/main/java/com/innovature/Library/controller/BorrowController.java index 50a4e84b..4ce70895 100644 --- a/BackEnd/Library/src/main/java/com/innovature/Library/controller/BorrowController.java +++ b/BackEnd/Library/src/main/java/com/innovature/Library/controller/BorrowController.java @@ -27,7 +27,9 @@ import com.innovature.Library.entity.Borrow; import com.innovature.Library.form.BorrowForm; import com.innovature.Library.service.BorrowService; +import com.innovature.Library.service.impl.BorrowServiceImpl; import com.innovature.Library.view.BorrowDetailView; +import com.innovature.Library.view.rentChartView; //import com.innovature.Library.view.BorrowListView; import com.innovature.Library.view.BorrowListView; @@ -39,6 +41,9 @@ public class BorrowController { @Autowired private BorrowService bService; + @Autowired + private BorrowServiceImpl borrowServices; + //load all borrow list @GetMapping @@ -254,6 +259,16 @@ public BorrowDetailView undo( +///////////////////////////////////// + + + +@GetMapping("/admin/chart") + public rentChartView getchart(){ + rentChartView test =borrowServices.getChart(); + return test; + } + } diff --git a/BackEnd/Library/src/main/java/com/innovature/Library/controller/csvController.java b/BackEnd/Library/src/main/java/com/innovature/Library/controller/csvController.java index 7eb7584d..feb17fe1 100644 --- a/BackEnd/Library/src/main/java/com/innovature/Library/controller/csvController.java +++ b/BackEnd/Library/src/main/java/com/innovature/Library/controller/csvController.java @@ -61,28 +61,5 @@ public ResponseEntity uploadFile(@RequestParam("file") Multipar return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseMessage(message,"")); } - @GetMapping("/tutorials") - public ResponseEntity> getAllTutorials() { - try { - List tutorials = csvService.getAll(); - - if (tutorials.isEmpty()) { - return new ResponseEntity<>(HttpStatus.NO_CONTENT); - } - - return new ResponseEntity<>(tutorials, HttpStatus.OK); - } catch (Exception e) { - return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR); - } - } - - @GetMapping("/download") - public ResponseEntity downloadFile() { - InputStreamResource file = new InputStreamResource(csvService.load()); - - return ResponseEntity.ok() - .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;") - .contentType(MediaType.parseMediaType("application/csv")) - .body(file); - } + } \ No newline at end of file diff --git a/BackEnd/Library/src/main/java/com/innovature/Library/csv_helper/csvHelper.java b/BackEnd/Library/src/main/java/com/innovature/Library/csv_helper/csvHelper.java index a03d0543..2c44b3df 100644 --- a/BackEnd/Library/src/main/java/com/innovature/Library/csv_helper/csvHelper.java +++ b/BackEnd/Library/src/main/java/com/innovature/Library/csv_helper/csvHelper.java @@ -65,32 +65,7 @@ public static boolean hasCSVFormat(MultipartFile file){ } -public static ByteArrayInputStream loadFromdb(ListcsvList){ - final CSVFormat format=CSVFormat.DEFAULT.withQuoteMode(QuoteMode.MINIMAL); - try(ByteArrayOutputStream out=new ByteArrayOutputStream(); - CSVPrinter csvPrinter=new CSVPrinter(new PrintWriter(out),format);){ - String[] HEADERs={"books_name","books_auther","publication","books_copies","category_id","status"}; - csvPrinter.printRecord(HEADERs); - for( csvUpload csv:csvList){ - Listdata=Arrays.asList( - //String.valueOf(csv.getBooksId()), - csv.getBooksName(), - csv.getBooksAuther(), - csv.getPublication(), - String.valueOf(csv.getBooksCopies()), - String.valueOf(csv.getCategoryId()), - String.valueOf(csv.getStatus()) - // csv.getImage() - ); - csvPrinter.printRecord(data); - } - csvPrinter.flush(); - return new ByteArrayInputStream(out.toByteArray()); - }catch(IOException e){ - throw new RuntimeException("fail to import data to CSV file: " + e.getMessage()); - } -} } diff --git a/BackEnd/Library/src/main/java/com/innovature/Library/entity/Borrow.java b/BackEnd/Library/src/main/java/com/innovature/Library/entity/Borrow.java index 1cff60df..87f698a2 100644 --- a/BackEnd/Library/src/main/java/com/innovature/Library/entity/Borrow.java +++ b/BackEnd/Library/src/main/java/com/innovature/Library/entity/Borrow.java @@ -1,5 +1,6 @@ package com.innovature.Library.entity; +import java.time.LocalDateTime; import java.util.Date; //import java.util.Objects; @@ -31,15 +32,17 @@ private Status(byte value) { @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer borrowId; - @Temporal(TemporalType.DATE) - private Date issueDate; + // @Temporal(TemporalType.DATE) + private LocalDateTime issueDate; + @Temporal(TemporalType.DATE) private Date returnDate; + @Temporal(TemporalType.DATE) private Date dueDate; - @Temporal(TemporalType.DATE) - private Date bookReturnedDate; + //@Temporal(TemporalType.DATE) + private LocalDateTime bookReturnedDate; @ManyToOne(optional = false, fetch = FetchType.EAGER) private Books books; @@ -66,12 +69,6 @@ public Borrow(Integer borrowId) { public Borrow(BorrowForm form, Books books, User user2) { - // Date dt = new Date(); - // this.issueDate= dt; - // this.user = new User(user2); - // this.booksId=form.getBooksId(); - - // this.issueDate = form.getIssueDate(); this.returnDate = form.getReturnDate(); this.dueDate = form.getDueDate(); this.books = books; @@ -79,10 +76,10 @@ public Borrow(BorrowForm form, Books books, User user2) { this.status = getStatus(); this.reason = form.getReason(); - Date dt = new Date(); + LocalDateTime dt =LocalDateTime.now(); this.issueDate = dt; - Date date = new Date(); + LocalDateTime date =LocalDateTime.now(); this.bookReturnedDate = date; this.dueDays=0L; this.fine=0L; @@ -105,11 +102,11 @@ public void setBorrowId(Integer borrowId) { this.borrowId = borrowId; } - public Date getIssueDate() { + public LocalDateTime getIssueDate() { return issueDate; } - public void setIssueDate(Date issueDate) { + public void setIssueDate(LocalDateTime issueDate) { this.issueDate = issueDate; } @@ -161,11 +158,11 @@ public void setReason(String reason) { this.reason = reason; } - public Date getBookReturnedDate() { + public LocalDateTime getBookReturnedDate() { return bookReturnedDate; } - public void setBookReturnedDate(Date bookReturnedDate) { + public void setBookReturnedDate(LocalDateTime bookReturnedDate) { this.bookReturnedDate = bookReturnedDate; } diff --git a/BackEnd/Library/src/main/java/com/innovature/Library/repository/BorrowRepository.java b/BackEnd/Library/src/main/java/com/innovature/Library/repository/BorrowRepository.java index 6f9bda2b..d9f13eaf 100644 --- a/BackEnd/Library/src/main/java/com/innovature/Library/repository/BorrowRepository.java +++ b/BackEnd/Library/src/main/java/com/innovature/Library/repository/BorrowRepository.java @@ -103,5 +103,11 @@ public interface BorrowRepository extends PagingAndSortingRepositoryfindAllC(); + } + +//mysql> select count(borrow_id) from borrow where book_returned_date between '2023-01-01' and '2023-01-07'; +//select count(borrow_id) from borrow where book_returned_date='2022-12-27'; \ No newline at end of file diff --git a/BackEnd/Library/src/main/java/com/innovature/Library/service/BorrowService.java b/BackEnd/Library/src/main/java/com/innovature/Library/service/BorrowService.java index 8423395b..be3210a6 100644 --- a/BackEnd/Library/src/main/java/com/innovature/Library/service/BorrowService.java +++ b/BackEnd/Library/src/main/java/com/innovature/Library/service/BorrowService.java @@ -64,4 +64,7 @@ public interface BorrowService { Integer BorrowBlock(); + // public RentCharView getChart(); + + } diff --git a/BackEnd/Library/src/main/java/com/innovature/Library/service/csvService.java b/BackEnd/Library/src/main/java/com/innovature/Library/service/csvService.java index d49762d4..6262b671 100644 --- a/BackEnd/Library/src/main/java/com/innovature/Library/service/csvService.java +++ b/BackEnd/Library/src/main/java/com/innovature/Library/service/csvService.java @@ -33,11 +33,7 @@ public void save(MultipartFile file){ } } - public ByteArrayInputStream load(){ - List csvTest=repository.findAll(); - ByteArrayInputStream in=csvHelper.loadFromdb(csvTest); - return in; - } + public ListgetAll(){ return repository.findAll(); diff --git a/BackEnd/Library/src/main/java/com/innovature/Library/service/impl/BorrowServiceImpl.java b/BackEnd/Library/src/main/java/com/innovature/Library/service/impl/BorrowServiceImpl.java index 3a67df1c..ef619483 100644 --- a/BackEnd/Library/src/main/java/com/innovature/Library/service/impl/BorrowServiceImpl.java +++ b/BackEnd/Library/src/main/java/com/innovature/Library/service/impl/BorrowServiceImpl.java @@ -6,6 +6,18 @@ import java.util.Date; //import java.sql.Date; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + + import javax.transaction.Transactional; import org.springframework.beans.factory.annotation.Autowired; @@ -30,6 +42,8 @@ import com.innovature.Library.view.BorrowDetailView; import com.innovature.Library.view.BorrowListView; +import com.innovature.Library.view.rentChartView; + import java.util.List; @@ -150,7 +164,7 @@ public BorrowDetailView updates(Integer borrowId, BorrowForm form) { Books books=booksRepository.findbyBorrowId(borrowId); - borrow.setIssueDate(new Date()); + borrow.setIssueDate(LocalDateTime.now()); borrow.setDueDate(form.getDueDate()); borrow.setReturnDate(form.getReturnDate()); borrow.setReason(null); @@ -191,7 +205,7 @@ public BorrowDetailView updateReturn(Integer borrowId, BorrowForm form) { Books books=booksRepository.findbyBorrowId(borrowId); - borrow.setBookReturnedDate(new Date()); + borrow.setBookReturnedDate(LocalDateTime.now()); borrow.setIssueDate(borrow.getIssueDate()); borrow.setReturnDate(borrow.getReturnDate()); borrow.setDueDate(borrow.getDueDate()); @@ -418,6 +432,92 @@ public void fineGeneration() { } + +public rentChartView getChart(){ + rentChartView result= new rentChartView(); + String[] weeks = {"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"}; + result.setLabel(Arrays.asList(weeks)); + + HashMap hm + = new HashMap(); + + hm.put(1, new Result(0, 0)); + hm.put(2, new Result(0, 0)); + hm.put(3, new Result(0, 0)); + hm.put(4, new Result(0, 0)); + hm.put(5, new Result(0, 0)); + hm.put(6, new Result(0, 0)); + hm.put(7, new Result(0, 0)); + + Lists=borrowRepository.findAllC(); + + + for(Borrow a:s){ + if(a.getStatus().equals("APPROVED")) + { + + LocalDateTime b = a.getIssueDate(); + System.out.println("---------------------------"+b); + // System.out.println("........>>>>>>>>>>>>>>>>....."+ b.getDayOfWeek().getValue()); + + hm.put(b.getDayOfWeek().getValue(), new Result(hm.get(b.getDayOfWeek().getValue()).getIssueCount() + 1, + hm.get(b.getDayOfWeek().getValue()).getReturnedCount())); + } + LocalDateTime c=null; + + if(a.getStatus().equals("RETURNED")) + { + + c = a.getBookReturnedDate(); + System.out.println("cccccccccccccccccccccccccccccccccccccccccc="+c); + + + hm.put(c.getDayOfWeek().getValue(), new Result(hm.get(c.getDayOfWeek().getValue()).getIssueCount() , + hm.get(c.getDayOfWeek().getValue()).getReturnedCount() +1)); + + System.out.println(hm.get(c.getDayOfWeek().getValue()).getReturnedCount()); + } + + // System.out.println(b.getDayOfWeek().getValue()); + // System.out.println(hm.get(b.getMonth().getValue()).getReturnCount()); + + + } + for (Map.Entry mapElement : hm.entrySet()) { + result.getIssueCount().add(mapElement.getValue().getIssueCount()+""); + result.getReturnedCount().add(mapElement.getValue().getReturnedCount()+""); + + } + return result; +} + + +public class Result { + private Integer issueCount; + private Integer returnedCount; + + public Result(Integer issueCount, Integer returnedCount) { + this.issueCount = issueCount; + this.returnedCount= returnedCount; + } + + public Integer getIssueCount() { + return issueCount; + } + + public void setIssueCount(Integer issueCount) { + this.issueCount = issueCount; + } + + public Integer getReturnedCount() { + return returnedCount; + } + + public void setReturnedCount(Integer returnedCount) { + this.returnedCount = returnedCount; + } +} + diff --git a/BackEnd/Library/src/main/java/com/innovature/Library/service/impl/EmailServiceImpl.java b/BackEnd/Library/src/main/java/com/innovature/Library/service/impl/EmailServiceImpl.java index eee6b062..8c6ac643 100644 --- a/BackEnd/Library/src/main/java/com/innovature/Library/service/impl/EmailServiceImpl.java +++ b/BackEnd/Library/src/main/java/com/innovature/Library/service/impl/EmailServiceImpl.java @@ -58,7 +58,9 @@ public boolean add(OtpForm form){ } + else{ return false; + } } @@ -108,7 +110,7 @@ protected PasswordAuthentication getPasswordAuthentication(){ msg.setText(message); Transport.send(msg); - s = true; // Set the "foo" variable to true after successfully sending emails + s = true; }catch(Exception e){ @@ -121,47 +123,7 @@ protected PasswordAuthentication getPasswordAuthentication(){ } - // boolean s=false; - // String senderEmail="stormhokspam@gmail.com"; - // String senderPassword="cyckyhziponehguf"; - - // Properties properties = new Properties(); - // properties.put("mail.smtp.auth", "true"); - // properties.put("mail.smtp.starttls.enable", "true"); - // properties.put("mail.smtp.host", "smtp.gmail.com"); - // properties.put("mail.smtp.port", "587"); // 587 is TLS port number - // Session session = Session.getInstance(properties, new Authenticator() - // { - // protected PasswordAuthentication getPasswordAuthentication(){ - - // return new PasswordAuthentication(senderEmail, senderPassword); - // } - // }); - // try { - - // MimeMessage msg = new MimeMessage(session); - - // msg.setFrom(new InternetAddress(senderEmail)); - - // msg.addRecipient(Message.RecipientType.TO, new InternetAddress(to)); - - // msg.setSubject(subject); - // msg.setText(message); - // Transport.send(msg); - - // s = true; // Set the "foo" variable to true after successfully sending emails - - // }catch(Exception e){ - - // } - - // return s; // and return foo variable - - - - - - + } diff --git a/BackEnd/Library/src/main/java/com/innovature/Library/view/rentChartView.java b/BackEnd/Library/src/main/java/com/innovature/Library/view/rentChartView.java new file mode 100644 index 00000000..c6b07bd9 --- /dev/null +++ b/BackEnd/Library/src/main/java/com/innovature/Library/view/rentChartView.java @@ -0,0 +1,33 @@ +package com.innovature.Library.view; +import java.util.ArrayList; +import java.util.List; + +public class rentChartView { + + private List label=new ArrayList<>(); + private List issueCount=new ArrayList<>(); + private List returnedCount=new ArrayList<>(); + public List getLabel() { + return label; + } + + public List getIssueCount() { + return issueCount; + } + public List getReturnedCount() { + return returnedCount; + } + public void setLabel(List label) { + this.label = label; + } + public void setIssueCount(List rentCount) { + this.issueCount = rentCount; + } + public void setReturnedCount(List returnedCount) { + this.returnedCount = returnedCount; + } + + + + +} diff --git a/FrontEnd/iprjt/package-lock.json b/FrontEnd/iprjt/package-lock.json index e3508b3e..4e9600e2 100644 --- a/FrontEnd/iprjt/package-lock.json +++ b/FrontEnd/iprjt/package-lock.json @@ -22,6 +22,7 @@ "@ng-bootstrap/ng-bootstrap": "^13.0.0", "@popperjs/core": "^2.10.2", "bootstrap": "^5.2.3", + "chart.js": "^4.1.2", "material-icons": "^1.13.1", "ng-angular-popup": "^0.2.0", "ngx-pagination": "^6.0.3", @@ -2714,6 +2715,11 @@ "@jridgewell/sourcemap-codec": "1.4.14" } }, + "node_modules/@kurkle/color": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.1.tgz", + "integrity": "sha512-hW0GwZj06z/ZFUW2Espl7toVDjghJN+EKqyXzPSV8NV89d5BYp5rRMBJoc+aUN0x5OXDMeRQHazejr2Xmqj2tw==" + }, "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", @@ -4045,6 +4051,17 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, + "node_modules/chart.js": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.1.2.tgz", + "integrity": "sha512-9L1w6WLPq6ztiWVVOYtDtpo0CUsBKDWPrUEdwChAyzczaikqeSwNKEv3QpJ7EO4ICcLSi6UDVhgvcnUhRJidRA==", + "dependencies": { + "@kurkle/color": "^0.3.0" + }, + "engines": { + "pnpm": "^7.0.0" + } + }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -13696,6 +13713,11 @@ "@jridgewell/sourcemap-codec": "1.4.14" } }, + "@kurkle/color": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.1.tgz", + "integrity": "sha512-hW0GwZj06z/ZFUW2Espl7toVDjghJN+EKqyXzPSV8NV89d5BYp5rRMBJoc+aUN0x5OXDMeRQHazejr2Xmqj2tw==" + }, "@leichtgewicht/ip-codec": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", @@ -14751,6 +14773,14 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, + "chart.js": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.1.2.tgz", + "integrity": "sha512-9L1w6WLPq6ztiWVVOYtDtpo0CUsBKDWPrUEdwChAyzczaikqeSwNKEv3QpJ7EO4ICcLSi6UDVhgvcnUhRJidRA==", + "requires": { + "@kurkle/color": "^0.3.0" + } + }, "chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", diff --git a/FrontEnd/iprjt/package.json b/FrontEnd/iprjt/package.json index f24ab8e5..49938599 100644 --- a/FrontEnd/iprjt/package.json +++ b/FrontEnd/iprjt/package.json @@ -24,6 +24,7 @@ "@ng-bootstrap/ng-bootstrap": "^13.0.0", "@popperjs/core": "^2.10.2", "bootstrap": "^5.2.3", + "chart.js": "^4.1.2", "material-icons": "^1.13.1", "ng-angular-popup": "^0.2.0", "ngx-pagination": "^6.0.3", @@ -45,4 +46,4 @@ "karma-jasmine-html-reporter": "~2.0.0", "typescript": "~4.7.2" } -} \ No newline at end of file +} diff --git a/FrontEnd/iprjt/src/app/addcategory/addcategory.component.ts b/FrontEnd/iprjt/src/app/addcategory/addcategory.component.ts index c9ea5792..395858cf 100644 --- a/FrontEnd/iprjt/src/app/addcategory/addcategory.component.ts +++ b/FrontEnd/iprjt/src/app/addcategory/addcategory.component.ts @@ -99,7 +99,7 @@ openDialog() { const dialogConfig = new MatDialogConfig(); this.dialog.open(CategoryComponent, { - width:'25%',height:'40%' + width:'25%',height:'35%' } ); @@ -117,7 +117,7 @@ editCategory(categoryId:any) { const dialogConfig = new MatDialogConfig(); this.dialog.open(CategoryComponent, { - width:'25%',height:'40%' + width:'25%',height:'35%' } ); diff --git a/FrontEnd/iprjt/src/app/app.module.ts b/FrontEnd/iprjt/src/app/app.module.ts index 1c8098c0..7aa2c49b 100644 --- a/FrontEnd/iprjt/src/app/app.module.ts +++ b/FrontEnd/iprjt/src/app/app.module.ts @@ -52,6 +52,7 @@ import { MatInputModule } from '@angular/material/input'; import { MatOptionModule } from '@angular/material/core'; import { BorrowDetailViewComponent } from './borrow-detail-view/borrow-detail-view.component'; import { ForgotpasswordComponent } from './forgotpassword/forgotpassword.component'; +import {Chart} from 'chart.js'; // import {MatIconModule} from '@angular/material/icon'; // import { MatToolbarModule } from '@angular/material'; @@ -89,6 +90,7 @@ import { ForgotpasswordComponent } from './forgotpassword/forgotpassword.compone AddbooksComponent, BorrowDetailViewComponent, ForgotpasswordComponent, + // Chart // ModalComponent @@ -110,7 +112,8 @@ import { ForgotpasswordComponent } from './forgotpassword/forgotpassword.compone MatButtonModule, MatSelectModule, MatDialogModule, - MatInputModule + MatInputModule, + // Chart ///MatIconModule, diff --git a/FrontEnd/iprjt/src/app/body/body.component.css b/FrontEnd/iprjt/src/app/body/body.component.css index 64269233..e69de29b 100644 --- a/FrontEnd/iprjt/src/app/body/body.component.css +++ b/FrontEnd/iprjt/src/app/body/body.component.css @@ -1,255 +0,0 @@ -p{ - padding: 0px 0px 16px 1000px; - margin: 0px; - background-color: rgb(0, 0, 0); - background-image: url('../../../a.png'); - -} -.btnItem{ - border: none; - padding: 0; - background: none; - font-size: 18px; - font-style: normal ; - color: rgba(136, 253, 81, 0.73); -} - - - -/* .T-button { - border: none; - padding: 0; - background: none; - font-size: 11px; - font-style: italic; - - } */ - -.btnItem1{ - padding: 7; - border-color: rgba(16, 17, 16, 0.468); - background-color: rgba(83, 254, 3, 0.829); - font-size: 13px; - border-radius: 25px; -} -h1{ - padding: 0px; - margin: 0px; - background-image: url(data:image/jpeg;base64,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); - background-size: cover; - -webkit-filter: blur(5px); - -} -body, html { - - position: fixed; - margin: 0; - font-family: arial; - height: 0vh; - background: #ccc; - } - *, *:before, *:after { - box-sizing: border-box; - } - .nav-mobile { - /* position: fixed; */ - background: #446cb3; - /* background: #9f3800; */ - color: #fff; - padding: 0; - margin: 0; - cursor: auto; - font-size: 18px; - list-style-type: none; - box-shadow: 0 5px 5px -5px #333; - } - .nav-mobile:after { - content: ""; - display: table; - clear: both; - } - .nav-mobile svg { - height: 45px; - width: 65px; - padding: 9px; - } - .nav-mobile svg path { - fill: #fff; - } - .nav-mobile svg.icon-close { - display: none; - padding: 15px; - } - .nav-mobile li { - width: 100%; - height: 45px; - line-height: 46px; - text-align: center; - float: left; - } - .nav-mobile li a { - display: block; - color: #333; - width: 100%; - height: 100%; - text-decoration: none; - } - .nav-mobile .menu-button { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - margin: 0; - cursor: pointer; - display: block; - } - .nav-mobile .menu-button:after { - opacity: 0; - top: 45px; - content: ""; - width: 100vw; - display: block; - position: fixed; - height: 100vh; - background: rgba(0, 0, 0, 0.5); - content: ""; - pointer-events: none; - transition: opacity 0.2s cubic-bezier(0, 0, 0.3, 1); - transition-delay: 0.1s; - } - .nav-mobile #menu-toggle { - display: none; - } - .nav-mobile #menu-toggle.active ~ .menu-button .icon-close, .nav-mobile #menu-toggle:checked ~ .menu-button .icon-close { - display: block; - } - .nav-mobile #menu-toggle.active ~ .menu-button .icon-open, .nav-mobile #menu-toggle:checked ~ .menu-button .icon-open { - display: none; - } - .nav-mobile #menu-toggle.active ~ .menu-button:after, .nav-mobile #menu-toggle:checked ~ .menu-button:after { - opacity: 1; - pointer-events: auto; - transition: opacity 0.3s cubic-bezier(0, 0, 0.3, 1); - } - .nav-mobile #menu-toggle.active ~ .menu-sidebar, .nav-mobile #menu-toggle:checked ~ .menu-sidebar { - transform: translateX(0); - transition: transform 0.3s cubic-bezier(0, 0, 0.3, 1); - } - .nav-mobile .menu-container { - width: 65px; - float: left; - cursor: pointer; - position: absolute; - - } - .nav-mobile .menu-container .menu-sidebar { - box-shadow: 5px 0 5px -5px #333; - display: block; - width: 65vw; - bottom: 0; - background: white; - color: #333; - position: fixed; - transform: translateX(-405px); - transition: transform 0.3s cubic-bezier(0, 0, 0.3, 1); - top: 45px; - z-index: 2; - list-style-type: none; - padding: 0; - max-width: 250px; - } - .nav-mobile .menu-container .menu-sidebar .arrow { - position: absolute; - line-height: 50px; - font-size: 32px; - color: #555; - top: 0; - z-index: 0; - } - .nav-mobile .menu-container .menu-sidebar .arrow.left { - left: 25px; - } - .nav-mobile .menu-container .menu-sidebar .arrow.right { - right: 25px; - } - .nav-mobile .menu-container .menu-sidebar li { - height: 55px; - line-height: 55px; - font-size: 16px; - text-align: left; - position: relative; - border-bottom: 1px solid rgba(0, 0, 0, 0.1); - padding-left: 20px; - } - .nav-mobile .menu-container .menu-sidebar li:hover { - background: rgb(244, 244, 247); - } - .nav-mobile .menu-container .menu-sidebar li .menu-sub { - position: fixed; - top: 0; - right: 0; - bottom: 0; - width: 0; - overflow: hidden; - background: rgb(248, 248, 250); - visibility: hidden; - transition: all 0.3s cubic-bezier(0, 0, 0.3, 1); - border-left: 1px solid #ccc; - list-style-type: none; - padding: 0; - margin: 0; - z-index: 2; - max-width: 250px; - /* width side */ - } - .nav-mobile .menu-container .menu-sidebar li .menu-sub li { - overflow: hidden; - } - .nav-mobile .menu-container .menu-sidebar li .menu-sub .menu-sub-title { - padding-left: 50px; - } - .nav-mobile .menu-container .menu-sidebar li .submenu-label { - cursor: pointer; - width: 100%; - height: 100%; - display: block; - } - .nav-mobile .menu-container .menu-sidebar li .submenu-toggle { - display: none; - } - .nav-mobile .menu-container .menu-sidebar li .submenu-toggle.active ~ .menu-sub, .nav-mobile .menu-container .menu-sidebar li .submenu-toggle:checked ~ .menu-sub { - width: 65vw; - visibility: visible; - z-index: 1; - transition: width 0.35s cubic-bezier(0, 0, 0.3, 1); - } - - .alert { - padding: 20px; - background-color: #3b9438; - color: white; - } - - .closebtn { - margin-left: 15px; - color: white; - font-weight: bold; - float: right; - font-size: 22px; - line-height: 20px; - cursor: pointer; - transition: 0.3s; - } - - .closebtn:hover { - color: black; - } - .btnItem1{ - border: none; - padding: 0; - background: none; - font-size: 18px; - font-style: normal ; - color: rgba(238, 248, 248, 0.73); - } \ No newline at end of file diff --git a/FrontEnd/iprjt/src/app/body/body.component.html b/FrontEnd/iprjt/src/app/body/body.component.html index 5d96435a..84b24adf 100644 --- a/FrontEnd/iprjt/src/app/body/body.component.html +++ b/FrontEnd/iprjt/src/app/body/body.component.html @@ -1,29 +1,14 @@ - +

ADMIN HOME

+ - - \ No newline at end of file +
+

ISSUE AND RETURNED CHART

+ {{bar}} + +
+ \ No newline at end of file diff --git a/FrontEnd/iprjt/src/app/body/body.component.ts b/FrontEnd/iprjt/src/app/body/body.component.ts index 307636c7..aea072ca 100644 --- a/FrontEnd/iprjt/src/app/body/body.component.ts +++ b/FrontEnd/iprjt/src/app/body/body.component.ts @@ -2,6 +2,9 @@ import { Component, OnInit } from '@angular/core'; import { MinValidator } from '@angular/forms'; import { Router,Route } from '@angular/router'; import { BorrowService } from '../borrow.service'; +import { Chart, registerables } from 'chart.js'; +Chart.register(...registerables); +// Chart.register(Colors); @Component({ selector: 'app-body', @@ -10,78 +13,58 @@ import { BorrowService } from '../borrow.service'; }) export class BodyComponent implements OnInit { borrowdata: any; - + len:any; + i:number=0; + j:number=0; + inlen:any; + label:any []=[]; + count:any[]=[]; + mychart: any + barchart: any; + bar: any; constructor(private router:Router,private borrowService:BorrowService) { } -//private userService:UserService,private booksService:BooksService + ngOnInit(): void { + + + +this.borrowService.chartbar().subscribe(res=>{ +console.log("res=",res); + +this.bar=res; +this.barchart = new Chart("bar", { + type: 'bar', //this denotes the type of chart + data: { //values on X-Axis + labels:res.label, + datasets: [ + { + label: "ISSUE COUNT", + data: res.issueCount, + backgroundColor: 'white' + }, + { + label: "RETURN COUNT", + data: res.returnedCount, + backgroundColor: 'green' + } + ] + }, + options: { + aspectRatio:3.3 + } +}); + + + + + + +}) + + +} + - sessionStorage.clear(); - - // const schedule = require('node-schedule') - // const job = schedule.scheduleJob('21 * * * *', this.sendMail(){ - // console.log('Send my email.') - // }) - - - - this.sendMail() - - } - - - onClickDue() - { - this.router.navigate(['/fine']) - } - - onClickCategory() - { - this.router.navigate(['/category']) - } - onClickBorrow() - { - this.router.navigate(['/borrow']) - } - onClickAddBooks() - { - this.router.navigate(['/books']) - } - userDetails() - { - this.router.navigate(['/user-details']) - } - logout() - { - // if (confirm('Are you sure you want to LogOuT?')) { - // localStorage. clear() - // this.router.navigate(['/login']) - // } else { - - this.router.navigate(['/login']) - // } - } - onClickProfile() - { - this.router.navigate(['/view-adminprofile']) - } - - sendMail(){ - // this.borrowService.LoadDue().subscribe((data: any)=>{ - // console.log("due date expired details"); - // console.log(data); - // let array1=data; - // // this.borrowService.sendMail(array1[1].user.userId).subscribe - // // ((data=>{})); - // for (let i=0;i< array1.length;i++){ - // console.log(array1[i].user.userId) - // // this.borrowService.sendMail(array1[i].user.userId) - // // console.log(array1[i].user.email) - // this.borrowService.sendMail(array1[i].user.userId).subscribe - // ((data=>{})); - // } - - // }); - } diff --git a/FrontEnd/iprjt/src/app/borrow.service.ts b/FrontEnd/iprjt/src/app/borrow.service.ts index f65089ca..a5b86b13 100644 --- a/FrontEnd/iprjt/src/app/borrow.service.ts +++ b/FrontEnd/iprjt/src/app/borrow.service.ts @@ -29,6 +29,11 @@ handleError(err: HttpErrorResponse): any { ////////////////////////////////////////////// + + chartbar():Observable{ + return this.http.get('http://localhost:8080/borrow/admin/chart') + } + sendMail(userId: any):Observable { console.log("inservice"+userId) return this.http.post('http://localhost:8080/email/emailsent/'+userId,userId).pipe((catchError(err => this.handleError(err)))); diff --git a/FrontEnd/iprjt/src/app/borrow/borrow.component.html b/FrontEnd/iprjt/src/app/borrow/borrow.component.html index c55ac124..43dc0289 100644 --- a/FrontEnd/iprjt/src/app/borrow/borrow.component.html +++ b/FrontEnd/iprjt/src/app/borrow/borrow.component.html @@ -24,30 +24,30 @@

Borrow Details

User Name - - + + Book Name - - + + Issue Date - - + + Due Date - - + + Fine(INR) - - + + Status - - + + diff --git a/FrontEnd/iprjt/src/app/fine/fine.component.css b/FrontEnd/iprjt/src/app/fine/fine.component.css index 0bef6858..28cd43dd 100644 --- a/FrontEnd/iprjt/src/app/fine/fine.component.css +++ b/FrontEnd/iprjt/src/app/fine/fine.component.css @@ -2,6 +2,7 @@ table{ width: 58%; border: none; text-align: center; + position:relative; } /* tr{ diff --git a/FrontEnd/iprjt/src/app/fine/fine.component.html b/FrontEnd/iprjt/src/app/fine/fine.component.html index ccfe60f4..e03623b7 100644 --- a/FrontEnd/iprjt/src/app/fine/fine.component.html +++ b/FrontEnd/iprjt/src/app/fine/fine.component.html @@ -1,6 +1,6 @@ -
-
+
+

diff --git a/FrontEnd/iprjt/src/app/forgotpassword/forgotpassword.component.html b/FrontEnd/iprjt/src/app/forgotpassword/forgotpassword.component.html index 6b2ed929..8b072220 100644 --- a/FrontEnd/iprjt/src/app/forgotpassword/forgotpassword.component.html +++ b/FrontEnd/iprjt/src/app/forgotpassword/forgotpassword.component.html @@ -20,7 +20,7 @@ -