Mix-Max
# All-in-One Multi-Feature Website (HTML + CSS + JS + Java/Spring Boot) — COMPLETE
This repository contains a **complete, runnable Spring Boot** application that serves a single-page frontend (`index.html`) and provides REST APIs for Notes, Habits, Finance (Transactions), Library (Books) and Quiz questions.
> **Stack**: Java 17+, Spring Boot, Spring Data JPA, H2 (default — configurable to MySQL), HTML/CSS/Vanilla JS frontend served from `/static`.
---
## 📁 Project Structure
```
all-in-one-app/
├─ pom.xml
├─ src/
│ ├─ main/
│ │ ├─ java/
│ │ │ └─ com/example/app/
│ │ │ ├─ WebAppApplication.java
│ │ │ ├─ model/
│ │ │ │ ├─ Note.java
│ │ │ │ ├─ Habit.java
│ │ │ │ ├─ Transaction.java
│ │ │ │ ├─ Book.java
│ │ │ │ └─ QuizQuestion.java
│ │ │ ├─ repo/
│ │ │ │ ├─ NoteRepository.java
│ │ │ │ ├─ HabitRepository.java
│ │ │ │ ├─ TransactionRepository.java
│ │ │ │ ├─ BookRepository.java
│ │ │ │ └─ QuizQuestionRepository.java
│ │ │ └─ controller/
│ │ │ ├─ NoteController.java
│ │ │ ├─ HabitController.java
│ │ │ ├─ FinanceController.java
│ │ │ ├─ LibraryController.java
│ │ │ └─ QuizController.java
│ │ └─ resources/
│ │ ├─ application.properties
│ │ └─ static/
│ │ └─ index.html
└─ README.md
```
---
## pom.xml
```xml
4.0.0
com.example
all-in-one-app
0.0.1-SNAPSHOT
All In One App
All features in one Spring Boot app
org.springframework.boot
spring-boot-starter-parent
3.3.2
17
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-data-jpa
com.h2database
h2
runtime
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-maven-plugin
```
---
## Java — Application Entry
### `WebAppApplication.java`
```java
package com.example.app;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class WebAppApplication {
public static void main(String[] args) {
SpringApplication.run(WebAppApplication.class, args);
}
}
```
---
## Models (`com.example.app.model`)
All entities use `jakarta.persistence` annotations.
### `Note.java`
```java
package com.example.app.model;
import jakarta.persistence.*;
@Entity
public class Note {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(length = 2048)
private String text;
public Note() {}
public Note(String text) { this.text = text; }
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getText() { return text; }
public void setText(String text) { this.text = text; }
}
```
### `Habit.java`
```java
package com.example.app.model;
import jakarta.persistence.*;
@Entity
public class Habit {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private boolean done;
public Habit() {}
public Habit(String name) { this.name = name; this.done = false; }
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public boolean isDone() { return done; }
public void setDone(boolean done) { this.done = done; }
}
```
### `Transaction.java`
```java
package com.example.app.model;
import jakarta.persistence.*;
@Entity
public class Transaction {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String descText;
private double amount;
public Transaction() {}
public Transaction(String descText, double amount) {
this.descText = descText; this.amount = amount;
}
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getDescText() { return descText; }
public void setDescText(String descText) { this.descText = descText; }
public double getAmount() { return amount; }
public void setAmount(double amount) { this.amount = amount; }
}
```
### `Book.java`
```java
package com.example.app.model;
import jakarta.persistence.*;
@Entity
public class Book {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
public Book() {}
public Book(String title) { this.title = title; }
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getTitle() { return title; }
public void setTitle(String title) { this.title = title; }
}
```
### `QuizQuestion.java` (complete getters/setters)
```java
package com.example.app.model;
import jakarta.persistence.*;
@Entity
public class QuizQuestion {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String question;
private String optionA;
private String optionB;
private String optionC;
private String answer; // store the correct option text
public QuizQuestion() {}
public QuizQuestion(String question, String optionA, String optionB, String optionC, String answer) {
this.question = question;
this.optionA = optionA; this.optionB = optionB; this.optionC = optionC;
this.answer = answer;
}
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getQuestion() { return question; }
public void setQuestion(String question) { this.question = question; }
public String getOptionA() { return optionA; }
public void setOptionA(String optionA) { this.optionA = optionA; }
public String getOptionB() { return optionB; }
public void setOptionB(String optionB) { this.optionB = optionB; }
public String getOptionC() { return optionC; }
public void setOptionC(String optionC) { this.optionC = optionC; }
public String getAnswer() { return answer; }
public void setAnswer(String answer) { this.answer = answer; }
}
```
---
## Repositories (`com.example.app.repo`)
Each repository is a simple `JpaRepository` interface.
Example — `NoteRepository.java`:
```java
package com.example.app.repo;
import com.example.app.model.Note;
import org.springframework.data.jpa.repository.JpaRepository;
public interface NoteRepository extends JpaRepository {}
```
Repeat same pattern for `HabitRepository`, `TransactionRepository`, `BookRepository`, `QuizQuestionRepository` by replacing the entity type.
---
## Controllers (`com.example.app.controller`)
Each controller exposes the REST API used by the frontend.
### `NoteController.java`
```java
package com.example.app.controller;
import com.example.app.model.Note;
import com.example.app.repo.NoteRepository;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api/notes")
public class NoteController {
private final NoteRepository repo;
public NoteController(NoteRepository repo) { this.repo = repo; }
@GetMapping
public List all() { return repo.findAll(); }
@PostMapping
public Note create(@RequestBody Note note) { return repo.save(note); }
@DeleteMapping("/{id}")
public void delete(@PathVariable Long id) { repo.deleteById(id); }
}
```
### `HabitController.java`
```java
package com.example.app.controller;
import com.example.app.model.Habit;
import com.example.app.repo.HabitRepository;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api/habits")
public class HabitController {
private final HabitRepository repo;
public HabitController(HabitRepository repo) { this.repo = repo; }
@GetMapping
public List all() { return repo.findAll(); }
@PostMapping
public Habit create(@RequestBody Habit habit) { return repo.save(habit); }
@PutMapping("/{id}/toggle")
public Habit toggle(@PathVariable Long id) {
Habit h = repo.findById(id).orElseThrow();
h.setDone(!h.isDone());
return repo.save(h);
}
@DeleteMapping("/{id}")
public void delete(@PathVariable Long id) { repo.deleteById(id); }
}
```
### `FinanceController.java`
```java
package com.example.app.controller;
import com.example.app.model.Transaction;
import com.example.app.repo.TransactionRepository;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api/finance")
public class FinanceController {
private final TransactionRepository repo;
public FinanceController(TransactionRepository repo) { this.repo = repo; }
@GetMapping
public List all() { return repo.findAll(); }
@PostMapping
public Transaction create(@RequestBody Transaction t) { return repo.save(t); }
@DeleteMapping("/{id}")
public void delete(@PathVariable Long id) { repo.deleteById(id); }
}
```
### `LibraryController.java`
```java
package com.example.app.controller;
import com.example.app.model.Book;
import com.example.app.repo.BookRepository;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api/library")
public class LibraryController {
private final BookRepository repo;
public LibraryController(BookRepository repo) { this.repo = repo; }
@GetMapping
public List all() { return repo.findAll(); }
@PostMapping
public Book create(@RequestBody Book b) { return repo.save(b); }
@DeleteMapping("/{id}")
public void delete(@PathVariable Long id) { repo.deleteById(id); }
}
```
### `QuizController.java`
```java
package com.example.app.controller;
import com.example.app.model.QuizQuestion;
import com.example.app.repo.QuizQuestionRepository;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api/quiz")
public class QuizController {
private final QuizQuestionRepository repo;
public QuizController(QuizQuestionRepository repo) { this.repo = repo; }
@GetMapping
public List all() { return repo.findAll(); }
@PostMapping
public QuizQuestion create(@RequestBody QuizQuestion q) { return repo.save(q); }
}
```
---
## application.properties (default H2 in-memory, change for MySQL)
```properties
# H2 in-memory DB (for quick start). Switch to MySQL later if you want.
spring.datasource.url=jdbc:h2:mem:demo;DB_CLOSE_DELAY=-1;MODE=MySQL
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.hibernate.ddl-auto=update
spring.h2.console.enabled=true
spring.h2.console.path=/h2
# Serve index.html from /static
spring.web.resources.static-locations=classpath:/static/
```
**To use a file-backed H2 (persist between restarts):**
```
spring.datasource.url=jdbc:h2:file:./data/demo;MODE=MySQL
```
**To use MySQL:** add MySQL dependency to `pom.xml` and set properties like:
```properties
spring.datasource.url=jdbc:mysql://localhost:3306/appdb?useSSL=false&serverTimezone=UTC
spring.datasource.username=your_user
spring.datasource.password=your_pass
spring.jpa.hibernate.ddl-auto=update
```
---
## Frontend — `src/main/resources/static/index.html`
Complete single-file frontend which uses the REST APIs. Save this file at `src/main/resources/static/index.html`.
```html
All-in-One Web App
```
---
## README (quick start)
1. Install **Java 17+** and **Maven**.
2. Create project files with the structure above (or clone if you saved this as a repo).
3. From project root run:
```bash
mvn spring-boot:run
```
4. Open `http://localhost:8080/` in your browser.
5. Access H2 console at `http://localhost:8080/h2` (JDBC URL: `jdbc:h2:mem:demo`, user `sa`, blank password).
To build a jar:
```bash
mvn clean package
java -jar target/all-in-one-app-0.0.1-SNAPSHOT.jar
```
---
## Next improvements you might want
* Add authentication (Spring Security + JWT) if multi-user is required.
* Use MySQL/Postgres for persistent DB across restarts.
* Add file upload support for library (book covers / PDFs).
* Add charts (Chart.js) for Finance analytics.
* Add client-side routing or SPA framework (React/Vue) for richer UX.
---
If you want, I can now:
* generate the full project as a downloadable ZIP, or
* switch the datasource to MySQL and provide exact steps, or
* add user authentication with registration/login and per-user data isolation.
Which of these would you like next?
🚀 All-in-One Web App
Notes • Habits • Quiz • Finance • Library
Quick Add Note
New Habit
Finance
Total Balance: 0
Library
❓ Quiz
Click start to fetch questions from backend
Click Start
Comments
Post a Comment