bram4627 commited on
Commit
2bdecc5
·
verified ·
1 Parent(s): edb27ef

Update templates/index.html

Browse files
Files changed (1) hide show
  1. templates/index.html +252 -258
templates/index.html CHANGED
@@ -1,258 +1,252 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>Gold Price Prediction System</title>
7
- <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
8
- <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet">
9
- <style>
10
- .gradient-bg {
11
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
12
- color: white;
13
- }
14
- .gold-accent {
15
- color: #FFD700;
16
- }
17
- .prediction-card {
18
- border: none;
19
- box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
20
- transition: transform 0.3s ease;
21
- }
22
- .prediction-card:hover {
23
- transform: translateY(-5px);
24
- }
25
- .price-up {
26
- color: #28a745;
27
- }
28
- .price-down {
29
- color: #dc3545;
30
- }
31
- .loading-spinner {
32
- display: none;
33
- }
34
- .navbar-brand {
35
- font-weight: bold;
36
- }
37
- .hero-section {
38
- background: linear-gradient(rgba(0,0,0,0.5), rgba(0,0,0,0.5)), url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 300"><defs><linearGradient id="grad" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" style="stop-color:%23FFD700;stop-opacity:0.3" /><stop offset="100%" style="stop-color:%23FFA500;stop-opacity:0.1" /></linearGradient></defs><rect width="1000" height="300" fill="url(%23grad)"/></svg>');
39
- color: white;
40
- padding: 100px 0;
41
- }
42
- </style>
43
- </head>
44
- <body>
45
- <!-- Navigation -->
46
- <nav class="navbar navbar-expand-lg navbar-dark gradient-bg">
47
- <div class="container">
48
- <a class="navbar-brand" href="#">
49
- <i class="fas fa-coins gold-accent"></i>
50
- Gold Price Predictor
51
- </a>
52
- <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
53
- <span class="navbar-toggler-icon"></span>
54
- </button>
55
- <div class="collapse navbar-collapse" id="navbarNav">
56
- <ul class="navbar-nav ms-auto">
57
- <li class="nav-item">
58
- <a class="nav-link active" href="/">Home</a>
59
- </li>
60
- <li class="nav-item">
61
- <a class="nav-link" href="/data-analysis">Data Analysis</a>
62
- </li>
63
- </ul>
64
- </div>
65
- </div>
66
- </nav>
67
-
68
- <!-- Hero Section -->
69
- <section class="hero-section text-center">
70
- <div class="container">
71
- <h1 class="display-4 mb-4">
72
- <i class="fas fa-chart-line gold-accent"></i>
73
- Prediksi Harga Emas 7 Hari Kedepan
74
- </h1>
75
- <p class="lead mb-5">Sistem prediksi harga emas menggunakan Machine Learning dengan Linear Regression</p>
76
- <button class="btn btn-warning btn-lg" onclick="predictGoldPrice()">
77
- <i class="fas fa-magic"></i> Prediksi Sekarang
78
- </button>
79
- </div>
80
- </section>
81
-
82
- <!-- Main Content -->
83
- <div class="container my-5">
84
- <!-- Loading Spinner -->
85
- <div class="text-center loading-spinner" id="loadingSpinner">
86
- <div class="spinner-border text-warning" role="status" style="width: 3rem; height: 3rem;">
87
- <span class="visually-hidden">Loading...</span>
88
- </div>
89
- <p class="mt-3">Menganalisis data dan membuat prediksi...</p>
90
- </div>
91
-
92
- <!-- Results Section -->
93
- <div id="resultsSection" style="display: none;">
94
- <!-- Current Prices -->
95
- <div class="row mb-4">
96
- <div class="col-md-6">
97
- <div class="card prediction-card text-center">
98
- <div class="card-body">
99
- <h5 class="card-title"><i class="fas fa-clock"></i> Harga Saat Ini</h5>
100
- <div id="currentPrices"></div>
101
- </div>
102
- </div>
103
- </div>
104
- <div class="col-md-6">
105
- <div class="card prediction-card text-center">
106
- <div class="card-body">
107
- <h5 class="card-title"><i class="fas fa-trending-up"></i> Perkiraan Perubahan Total</h5>
108
- <div id="totalChanges"></div>
109
- </div>
110
- </div>
111
- </div>
112
- </div>
113
-
114
- <!-- Prediction Chart -->
115
- <div class="card prediction-card mb-4">
116
- <div class="card-header">
117
- <h5 class="mb-0"><i class="fas fa-chart-area"></i> Grafik Prediksi Harga Emas</h5>
118
- </div>
119
- <div class="card-body text-center">
120
- <img id="predictionChart" class="img-fluid" alt="Prediction Chart">
121
- </div>
122
- </div>
123
-
124
- <!-- Predictions Table -->
125
- <div class="card prediction-card">
126
- <div class="card-header">
127
- <h5 class="mb-0"><i class="fas fa-table"></i> Prediksi Harga 7 Hari Kedepan</h5>
128
- </div>
129
- <div class="card-body">
130
- <div class="table-responsive">
131
- <table class="table table-striped table-hover">
132
- <thead class="table-dark">
133
- <tr>
134
- <th>Tanggal</th>
135
- <th>Harga Tutup (IDR)</th>
136
- <th>Perubahan Tutup (%)</th>
137
- <th>Harga Buka (IDR)</th>
138
- <th>Perubahan Buka (%)</th>
139
- </tr>
140
- </thead>
141
- <tbody id="predictionsTable">
142
- </tbody>
143
- </table>
144
- </div>
145
- </div>
146
- </div>
147
- </div>
148
-
149
- <!-- Error Section -->
150
- <div id="errorSection" style="display: none;">
151
- <div class="alert alert-danger text-center" role="alert">
152
- <i class="fas fa-exclamation-triangle"></i>
153
- <span id="errorMessage"></span>
154
- </div>
155
- </div>
156
- </div>
157
-
158
- <!-- Footer -->
159
- <footer class="gradient-bg text-center py-4 mt-5">
160
- <div class="container">
161
- <p class="mb-0">&copy; 2025 Kelompok 4 - Sistem Prediksi Harga Emas. Powered by Machine Learning.</p>
162
- </div>
163
- </footer>
164
-
165
- <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script>
166
- <script>
167
- function predictGoldPrice() {
168
- // Show loading spinner
169
- document.getElementById('loadingSpinner').style.display = 'block';
170
- document.getElementById('resultsSection').style.display = 'none';
171
- document.getElementById('errorSection').style.display = 'none';
172
-
173
- // Make API call
174
- fetch('/predict', {
175
- method: 'POST',
176
- headers: {
177
- 'Content-Type': 'application/json',
178
- }
179
- })
180
- .then(response => response.json())
181
- .then(data => {
182
- document.getElementById('loadingSpinner').style.display = 'none';
183
-
184
- if (data.success) {
185
- displayResults(data);
186
- } else {
187
- displayError(data.error || 'Unknown error occurred');
188
- }
189
- })
190
- .catch(error => {
191
- document.getElementById('loadingSpinner').style.display = 'none';
192
- displayError('Network error: ' + error.message);
193
- });
194
- }
195
-
196
- function displayResults(data) {
197
- // Display current prices
198
- const currentPricesHtml = `
199
- <p class="mb-1"><strong>Harga Tutup:</strong> <span class="gold-accent">IDR ${data.current_prices.close.toLocaleString()}</span></p>
200
- <p class="mb-0"><strong>Harga Buka:</strong> <span class="gold-accent">IDR ${data.current_prices.open.toLocaleString()}</span></p>
201
- `;
202
- document.getElementById('currentPrices').innerHTML = currentPricesHtml;
203
-
204
- // Display total changes
205
- const totalChangesHtml = `
206
- <p class="mb-1"><strong>Tutup:</strong>
207
- <span class="${data.total_changes.close >= 0 ? 'price-up' : 'price-down'}">
208
- ${data.total_changes.close >= 0 ? '+' : ''}${data.total_changes.close}%
209
- <i class="fas fa-arrow-${data.total_changes.close >= 0 ? 'up' : 'down'}"></i>
210
- </span>
211
- </p>
212
- <p class="mb-0"><strong>Buka:</strong>
213
- <span class="${data.total_changes.open >= 0 ? 'price-up' : 'price-down'}">
214
- ${data.total_changes.open >= 0 ? '+' : ''}${data.total_changes.open}%
215
- <i class="fas fa-arrow-${data.total_changes.open >= 0 ? 'up' : 'down'}"></i>
216
- </span>
217
- </p>
218
- `;
219
- document.getElementById('totalChanges').innerHTML = totalChangesHtml;
220
-
221
- // Display chart
222
- document.getElementById('predictionChart').src = 'data:image/png;base64,' + data.chart;
223
-
224
- // Display predictions table
225
- let tableHtml = '';
226
- data.predictions.forEach(prediction => {
227
- tableHtml += `
228
- <tr>
229
- <td><strong>${prediction.date}</strong></td>
230
- <td>IDR ${prediction.close_price.toLocaleString()}</td>
231
- <td class="${prediction.close_change >= 0 ? 'price-up' : 'price-down'}">
232
- ${prediction.close_change >= 0 ? '+' : ''}${prediction.close_change}%
233
- <i class="fas fa-arrow-${prediction.close_change >= 0 ? 'up' : 'down'}"></i>
234
- </td>
235
- <td>IDR ${prediction.open_price.toLocaleString()}</td>
236
- <td class="${prediction.open_change >= 0 ? 'price-up' : 'price-down'}">
237
- ${prediction.open_change >= 0 ? '+' : ''}${prediction.open_change}%
238
- <i class="fas fa-arrow-${prediction.open_change >= 0 ? 'up' : 'down'}"></i>
239
- </td>
240
- </tr>
241
- `;
242
- });
243
- document.getElementById('predictionsTable').innerHTML = tableHtml;
244
-
245
- document.getElementById('resultsSection').style.display = 'block';
246
- }
247
-
248
- function displayError(errorMessage) {
249
- document.getElementById('errorMessage').textContent = errorMessage;
250
- document.getElementById('errorSection').style.display = 'block';
251
- }
252
-
253
- function formatNumber(num) {
254
- return new Intl.NumberFormat('id-ID').format(num);
255
- }
256
- </script>
257
- </body>
258
- </html>
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Gold Price Prediction System</title>
7
+ <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" />
8
+ <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet" />
9
+ <style>
10
+ .gradient-bg {
11
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
12
+ color: white;
13
+ }
14
+ .gold-accent {
15
+ color: #ffd700;
16
+ }
17
+ .prediction-card {
18
+ border: none;
19
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
20
+ transition: transform 0.3s ease;
21
+ }
22
+ .prediction-card:hover {
23
+ transform: translateY(-5px);
24
+ }
25
+ .price-up {
26
+ color: #28a745;
27
+ }
28
+ .price-down {
29
+ color: #dc3545;
30
+ }
31
+ .loading-spinner {
32
+ display: none;
33
+ }
34
+ .navbar-brand {
35
+ font-weight: bold;
36
+ }
37
+ .hero-section {
38
+ background: linear-gradient(rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5)),
39
+ url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 300"><defs><linearGradient id="grad" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" style="stop-color:%23FFD700;stop-opacity:0.3" /><stop offset="100%" style="stop-color:%23FFA500;stop-opacity:0.1" /></linearGradient></defs><rect width="1000" height="300" fill="url(%23grad)"/></svg>');
40
+ color: white;
41
+ padding: 100px 0;
42
+ }
43
+ </style>
44
+ </head>
45
+ <body>
46
+ <!-- Navigation -->
47
+ <nav class="navbar navbar-expand-lg navbar-dark gradient-bg">
48
+ <div class="container">
49
+ <a class="navbar-brand" href="#">
50
+ <i class="fas fa-coins gold-accent"></i>
51
+ Gold Price Predictor
52
+ </a>
53
+ <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
54
+ <span class="navbar-toggler-icon"></span>
55
+ </button>
56
+ <div class="collapse navbar-collapse" id="navbarNav">
57
+ <ul class="navbar-nav ms-auto">
58
+ <li class="nav-item">
59
+ <a class="nav-link active" href="/">Home</a>
60
+ </li>
61
+ <li class="nav-item">
62
+ <a class="nav-link" href="/data-analysis">Data Analysis</a>
63
+ </li>
64
+ </ul>
65
+ </div>
66
+ </div>
67
+ </nav>
68
+
69
+ <!-- Hero Section -->
70
+ <section class="hero-section text-center">
71
+ <div class="container">
72
+ <h1 class="display-4 mb-4">
73
+ <i class="fas fa-chart-line gold-accent"></i>
74
+ Prediksi Harga Emas 7 Hari Kedepan
75
+ </h1>
76
+ <p class="lead mb-5">Sistem prediksi harga emas menggunakan Machine Learning dengan Linear Regression</p>
77
+ <button class="btn btn-warning btn-lg" onclick="predictGoldPrice()"><i class="fas fa-magic"></i> Prediksi Sekarang</button>
78
+ </div>
79
+ </section>
80
+
81
+ <!-- Main Content -->
82
+ <div class="container my-5">
83
+ <!-- Loading Spinner -->
84
+ <div class="text-center loading-spinner" id="loadingSpinner">
85
+ <div class="spinner-border text-warning" role="status" style="width: 3rem; height: 3rem">
86
+ <span class="visually-hidden">Loading...</span>
87
+ </div>
88
+ <p class="mt-3">Menganalisis data dan membuat prediksi...</p>
89
+ </div>
90
+
91
+ <!-- Results Section -->
92
+ <div id="resultsSection" style="display: none">
93
+ <!-- Current Prices -->
94
+ <div class="row mb-4">
95
+ <div class="col-md-6">
96
+ <div class="card prediction-card text-center">
97
+ <div class="card-body">
98
+ <h5 class="card-title"><i class="fas fa-clock"></i> Harga Saat Ini</h5>
99
+ <div id="currentPrices"></div>
100
+ </div>
101
+ </div>
102
+ </div>
103
+ <div class="col-md-6">
104
+ <div class="card prediction-card text-center">
105
+ <div class="card-body">
106
+ <h5 class="card-title"><i class="fas fa-trending-up"></i> Perkiraan Perubahan Total</h5>
107
+ <div id="totalChanges"></div>
108
+ </div>
109
+ </div>
110
+ </div>
111
+ </div> <!-- Prediction Chart -->
112
+ <div class="card prediction-card mb-4">
113
+ <div class="card-header">
114
+ <h5 class="mb-0"><i class="fas fa-chart-area"></i> Grafik Prediksi Harga Emas</h5>
115
+ </div>
116
+ <div class="card-body">
117
+ <div id="predictionChart"></div>
118
+ </div>
119
+ </div>
120
+
121
+ <!-- Predictions Table -->
122
+ <div class="card prediction-card">
123
+ <div class="card-header">
124
+ <h5 class="mb-0"><i class="fas fa-table"></i> Prediksi Harga 7 Hari Kedepan</h5>
125
+ </div>
126
+ <div class="card-body">
127
+ <div class="table-responsive">
128
+ <table class="table table-striped table-hover">
129
+ <thead class="table-dark">
130
+ <tr>
131
+ <th>Tanggal</th>
132
+ <th>Harga Tutup (IDR)</th>
133
+ <th>Perubahan Tutup (%)</th>
134
+ <th>Harga Buka (IDR)</th>
135
+ <th>Perubahan Buka (%)</th>
136
+ </tr>
137
+ </thead>
138
+ <tbody id="predictionsTable"></tbody>
139
+ </table>
140
+ </div>
141
+ </div>
142
+ </div>
143
+ </div>
144
+
145
+ <!-- Error Section -->
146
+ <div id="errorSection" style="display: none">
147
+ <div class="alert alert-danger text-center" role="alert">
148
+ <i class="fas fa-exclamation-triangle"></i>
149
+ <span id="errorMessage"></span>
150
+ </div>
151
+ </div>
152
+ </div>
153
+
154
+ <!-- Footer -->
155
+ <footer class="gradient-bg text-center py-4 mt-5">
156
+ <div class="container">
157
+ <p class="mb-0">&copy; 2025 Kelompok 4 - Sistem Prediksi Harga Emas. Powered by Machine Learning.</p>
158
+ </div>
159
+ </footer>
160
+
161
+ <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script>
162
+ <script>
163
+ function predictGoldPrice() {
164
+ // Show loading spinner
165
+ document.getElementById("loadingSpinner").style.display = "block";
166
+ document.getElementById("resultsSection").style.display = "none";
167
+ document.getElementById("errorSection").style.display = "none";
168
+
169
+ // Make API call
170
+ fetch("/predict", {
171
+ method: "POST",
172
+ headers: {
173
+ "Content-Type": "application/json",
174
+ },
175
+ })
176
+ .then((response) => response.json())
177
+ .then((data) => {
178
+ document.getElementById("loadingSpinner").style.display = "none";
179
+
180
+ if (data.success) {
181
+ displayResults(data);
182
+ } else {
183
+ displayError(data.error || "Unknown error occurred");
184
+ }
185
+ })
186
+ .catch((error) => {
187
+ document.getElementById("loadingSpinner").style.display = "none";
188
+ displayError("Network error: " + error.message);
189
+ });
190
+ }
191
+
192
+ function displayResults(data) {
193
+ // Display current prices
194
+ const currentPricesHtml = `
195
+ <p class="mb-1"><strong>Harga Tutup:</strong> <span class="gold-accent">IDR ${data.current_prices.close.toLocaleString()}</span></p>
196
+ <p class="mb-0"><strong>Harga Buka:</strong> <span class="gold-accent">IDR ${data.current_prices.open.toLocaleString()}</span></p>
197
+ `;
198
+ document.getElementById("currentPrices").innerHTML = currentPricesHtml;
199
+
200
+ // Display total changes
201
+ const totalChangesHtml = `
202
+ <p class="mb-1"><strong>Tutup:</strong>
203
+ <span class="${data.total_changes.close >= 0 ? "price-up" : "price-down"}">
204
+ ${data.total_changes.close >= 0 ? "+" : ""}${data.total_changes.close}%
205
+ <i class="fas fa-arrow-${data.total_changes.close >= 0 ? "up" : "down"}"></i>
206
+ </span>
207
+ </p>
208
+ <p class="mb-0"><strong>Buka:</strong>
209
+ <span class="${data.total_changes.open >= 0 ? "price-up" : "price-down"}">
210
+ ${data.total_changes.open >= 0 ? "+" : ""}${data.total_changes.open}%
211
+ <i class="fas fa-arrow-${data.total_changes.open >= 0 ? "up" : "down"}"></i>
212
+ </span>
213
+ </p>
214
+ `;
215
+ document.getElementById("totalChanges").innerHTML = totalChangesHtml; // Display chart
216
+ document.getElementById("predictionChart").innerHTML = data.chart_html;
217
+
218
+ // Display predictions table
219
+ let tableHtml = "";
220
+ data.predictions.forEach((prediction) => {
221
+ tableHtml += `
222
+ <tr>
223
+ <td><strong>${prediction.date}</strong></td>
224
+ <td>IDR ${prediction.close_price.toLocaleString()}</td>
225
+ <td class="${prediction.close_change >= 0 ? "price-up" : "price-down"}">
226
+ ${prediction.close_change >= 0 ? "+" : ""}${prediction.close_change}%
227
+ <i class="fas fa-arrow-${prediction.close_change >= 0 ? "up" : "down"}"></i>
228
+ </td>
229
+ <td>IDR ${prediction.open_price.toLocaleString()}</td>
230
+ <td class="${prediction.open_change >= 0 ? "price-up" : "price-down"}">
231
+ ${prediction.open_change >= 0 ? "+" : ""}${prediction.open_change}%
232
+ <i class="fas fa-arrow-${prediction.open_change >= 0 ? "up" : "down"}"></i>
233
+ </td>
234
+ </tr>
235
+ `;
236
+ });
237
+ document.getElementById("predictionsTable").innerHTML = tableHtml;
238
+
239
+ document.getElementById("resultsSection").style.display = "block";
240
+ }
241
+
242
+ function displayError(errorMessage) {
243
+ document.getElementById("errorMessage").textContent = errorMessage;
244
+ document.getElementById("errorSection").style.display = "block";
245
+ }
246
+
247
+ function formatNumber(num) {
248
+ return new Intl.NumberFormat("id-ID").format(num);
249
+ }
250
+ </script>
251
+ </body>
252
+ </html>