JINSI YA KUBADILI WEBSITE KUWA APP KWA KUTUMIA PWA HATUA KWA HATUA
1) PWA ni nini kwa kifupi
PWA ni website ambayo inaweza:
· kuonekana kama app
· kuinstalliwa kwenye simu au desktop
· kufunguka hata offline kwa baadhi ya pages
· kuwa na icon kwenye home screen
· kufungua bila browser tabs nyingi kama website ya kawaida
Ili system yako iwe PWA unahitaji vitu vikuu 3:
· manifest.json
- sw.js (service worker)
- icons za app
Halafu page yako kuu lazima:
- iwe na link ya manifest
- i-register service worker
- iwe na theme-color
- iwe HTTPS
2) Folder structure ya kutumia
Tengeneza structure hii kwenye project yako:
/project-folder
│
├── index.php
├── manifest.json
├── sw.js
├── offline.html
├── logo-header.png
│
└── icons
├── icon-72x72.png
├── icon-96x96.png
├── icon-128x128.png
├── icon-144x144.png
├── icon-152x152.png
├── icon-192x192.png
├── icon-384x384.png
└── icon-512x512.png
Kama system yako si index.php, bado unaweza kutumia page nyingine kama:
- home.php
- dashboard.php
- app.php
Lakini kwa guide hii nitabaki na index.php.
3) STEP 1: Andaa logo na icons
Kwa PWA, logo ya app haitumii PDF moja kwa moja. Inahitaji PNG images.
Wewe tayari una logo file kwenye
PDF.
Tumia zile files nilizokutengenezea tayari:
- Pakua PWA icons zip
- Pakua logo ya kawaida PNG
- Pakua logo ya header
Cha kufanya
- unzip star_quality_pwa_icons.zip
- copy folder la icons liingie ndani ya project yako
- copy logo-header.png liingie root ya project
4) STEP 2: Tengeneza manifest.json
Hii ndiyo file inayoiambia browser jina la app, icon zake, na namna ya kufunguka.
File: manifest.json
{
"name": "STAR QUALITY
MICROFINANCE",
"short_name": "SQM
App",
"description":
"Professional microfinance platform for loans, repayments, borrowers,
reports, and daily operations.",
"start_url":
"/index.php",
"scope": "/",
"display":
"standalone",
"orientation":
"portrait",
"background_color":
"#f8fbff",
"theme_color":
"#0d6efd",
"lang": "en",
"dir": "ltr",
"icons": [
{
"src":
"icons/icon-72x72.png",
"sizes":
"72x72",
"type":
"image/png"
},
{
"src":
"icons/icon-96x96.png",
"sizes":
"96x96",
"type":
"image/png"
},
{
"src":
"icons/icon-128x128.png",
"sizes":
"128x128",
"type":
"image/png"
},
{
"src": "icons/icon-144x144.png",
"sizes":
"144x144",
"type":
"image/png"
},
{
"src":
"icons/icon-152x152.png",
"sizes":
"152x152",
"type":
"image/png"
},
{
"src":
"icons/icon-192x192.png",
"sizes":
"192x192",
"type":
"image/png"
},
{
"src":
"icons/icon-384x384.png",
"sizes":
"384x384",
"type":
"image/png"
},
{
"src":
"icons/icon-512x512.png",
"sizes":
"512x512",
"type":
"image/png",
"purpose": "any
maskable"
}
],
"shortcuts": [
{
"name":
"Login",
"short_name":
"Login",
"description": "Open
login page",
"url":
"/mikopologin.php",
"icons": [
{
"src":
"icons/icon-192x192.png",
"sizes": "192x192",
"type":
"image/png"
}
]
},
{
"name":
"Dashboard",
"short_name":
"Dashboard",
"description": "Open
dashboard",
"url":
"/mikopodashboard.php",
"icons": [
{
"src": "icons/icon-192x192.png",
"sizes":
"192x192",
"type":
"image/png"
}
]
}
]
}
5) STEP 3: Tengeneza offline.html
Hii ndiyo page ya kuonyesha internet ikiwa haipo.
File: offline.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, initial-scale=1.0">
<title>Offline | STAR QUALITY
MICROFINANCE</title>
<meta name="theme-color"
content="#0d6efd">
<style>
body{
margin:0;
font-family:Arial, sans-serif;
background:#f8fbff;
display:flex;
align-items:center;
justify-content:center;
min-height:100vh;
color:#0f172a;
}
.box{
max-width:420px;
background:#fff;
padding:30px;
border-radius:20px;
box-shadow:0 15px 40px
rgba(0,0,0,.08);
text-align:center;
}
.icon{
font-size:60px;
margin-bottom:15px;
}
h1{
margin:0 0 10px;
font-size:28px;
}
p{
color:#64748b;
line-height:1.7;
}
a{
display:inline-block;
margin-top:15px;
text-decoration:none;
background:#0d6efd;
color:#fff;
padding:12px 20px;
border-radius:999px;
font-weight:bold;
}
</style>
</head>
<body>
<div class="box">
<div
class="icon">📡</div>
<h1>You are
offline</h1>
<p>Internet connection is
not available right now. Please reconnect and try again.</p>
<a
href="index.php">Retry</a>
</div>
</body>
</html>
6) STEP 4: Tengeneza sw.js
Hii ndiyo service worker. Kazi yake ni:
- ku-cache files
- kusaidia pages kufunguka hata internet ikiwa imekatika
- kufanya website ionekane kama app
File: sw.js
const CACHE_NAME =
'sqm-pwa-v1';
const FILES_TO_CACHE = [
'/',
'/index.php',
'/manifest.json',
'/offline.html',
'/logo-header.png',
'/icons/icon-72x72.png',
'/icons/icon-96x96.png',
'/icons/icon-128x128.png',
'/icons/icon-144x144.png',
'/icons/icon-152x152.png',
'/icons/icon-192x192.png',
'/icons/icon-384x384.png',
'/icons/icon-512x512.png',
'/mikopologin.php',
'/mikopodashboard.php',
'https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css',
'https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js',
'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.2/css/all.min.css',
'https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700;800&display=swap'
];
self.addEventListener('install', (event) => {
event.waitUntil(
caches.open(CACHE_NAME)
.then((cache) => {
return
cache.addAll(FILES_TO_CACHE);
})
.then(() =>
self.skipWaiting())
);
});
self.addEventListener('activate', (event) => {
event.waitUntil(
caches.keys().then((cacheNames)
=> {
return Promise.all(
cacheNames.map((cache)
=> {
if (cache !==
CACHE_NAME) {
return
caches.delete(cache);
}
})
);
}).then(() =>
self.clients.claim())
);
});
self.addEventListener('fetch', (event) => {
if (event.request.method !== 'GET')
return;
event.respondWith(
fetch(event.request)
.then((response) => {
const responseClone = response.clone();
caches.open(CACHE_NAME).then((cache) => {
cache.put(event.request, responseClone);
});
return response;
})
.catch(() => {
return
caches.match(event.request).then((cachedResponse) => {
if (cachedResponse) {
return
cachedResponse;
}
if
(event.request.mode === 'navigate') {
return
caches.match('/offline.html');
}
});
})
);
});
7) STEP 5: Tengeneza au badilisha index.php
Hii ndiyo page kuu ya app yako. Nimeweka version safi, yenye:
- logo yako kwenye navbar
- manifest
- install button
- service worker registration
- online/offline status
- PWA support
File: index.php
<?php
session_start();
/*
|--------------------------------------------------------------------------
| BASIC SETTINGS
|--------------------------------------------------------------------------
*/
$company_name = "STAR
MICROFINANCE";
$dashboard_url =
"mikopodashboard.php";
$login_url =
"mikopologin.php";
$logout_url =
"mikopologout.php";
$home_url =
"faulink_logout.php";
$phone_number = "444444444444";
$phone_clean =
"255746293637";
/*
|--------------------------------------------------------------------------
| SAFE URLS FOR META TAGS
|--------------------------------------------------------------------------
*/
$current_url = (
(isset($_SERVER['HTTPS']) &&
$_SERVER['HTTPS'] !== 'off') ? 'https://' : 'http://'
) . ($_SERVER['HTTP_HOST'] ?? 'localhost') . ($_SERVER['REQUEST_URI'] ?? '');
$site_logo = "icons/icon-512x512.png";
/*
|--------------------------------------------------------------------------
| OPTIONAL REDIRECT IF LOGGED IN
|--------------------------------------------------------------------------
*/
if (isset($_SESSION['user_id']) && !isset($_GET['stay'])) {
header("Location: " .
$dashboard_url);
exit;
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta
charset="UTF-8">
<title><?php echo
htmlspecialchars($company_name, ENT_QUOTES, 'UTF-8'); ?> | Trusted
Microfinance Services</title>
<meta name="viewport"
content="width=device-width, initial-scale=1.0, maximum-scale=1">
<!-- SEO -->
<meta name="description"
content="<?php echo htmlspecialchars($company_name, ENT_QUOTES,
'UTF-8'); ?> offers fast, secure, and reliable microfinance
services.">
<meta name="keywords"
content="microfinance, loans, Tanzania loans, repayment management,
<?php echo htmlspecialchars($company_name, ENT_QUOTES, 'UTF-8');
?>">
<meta name="author"
content="<?php echo htmlspecialchars($company_name, ENT_QUOTES,
'UTF-8'); ?>">
<meta name="robots"
content="index, follow">
<!-- PWA -->
<meta name="theme-color"
content="#0d6efd">
<meta
name="mobile-web-app-capable" content="yes">
<meta
name="application-name" content="<?php echo
htmlspecialchars($company_name, ENT_QUOTES, 'UTF-8'); ?>">
<meta
name="apple-mobile-web-app-capable" content="yes">
<meta
name="apple-mobile-web-app-title" content="<?php echo
htmlspecialchars($company_name, ENT_QUOTES, 'UTF-8'); ?>">
<meta
name="apple-mobile-web-app-status-bar-style" content="default">
<link rel="manifest"
href="manifest.json">
<link
rel="apple-touch-icon" href="icons/icon-192x192.png">
<link rel="icon"
type="image/png" sizes="192x192"
href="icons/icon-192x192.png">
<link rel="icon"
type="image/png" sizes="512x512"
href="icons/icon-512x512.png">
<!-- Open Graph -->
<meta
property="og:title" content="<?php echo
htmlspecialchars($company_name, ENT_QUOTES, 'UTF-8'); ?> | Trusted
Microfinance Services">
<meta
property="og:description" content="Fast approval, secure
lending, and simple loan management for individuals and businesses.">
<meta property="og:type"
content="website">
<meta property="og:url"
content="<?php echo htmlspecialchars($current_url, ENT_QUOTES,
'UTF-8'); ?>">
<meta property="og:image"
content="<?php echo htmlspecialchars($site_logo, ENT_QUOTES, 'UTF-8');
?>">
<!-- CSS -->
<link
href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css"
rel="stylesheet">
<link
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.2/css/all.min.css"
rel="stylesheet">
<style>
:root{
--primary:#0d6efd;
--primary-dark:#0a4fb3;
--accent:#00c2a8;
--dark:#0f172a;
--muted:#64748b;
--shadow:0 15px 45px rgba(15, 23, 42, 0.12);
}
body{
font-family:Arial,
sans-serif;
background:linear-gradient(180deg,#f8fbff 0%,#eef5ff 100%);
color:var(--dark);
margin:0;
padding:0;
}
.navbar{
background:#fff;
box-shadow:0 10px 30px
rgba(0,0,0,0.05);
}
.navbar-brand{
font-weight:800;
font-size:1.2rem;
color:var(--dark)!important;
text-decoration:none;
}
.nav-btn{
border-radius:999px;
padding:10px 20px;
font-weight:600;
}
.btn-main{
background:linear-gradient(135deg,var(--primary),var(--primary-dark));
color:#fff;
border:none;
}
.btn-main:hover{
color:#fff;
}
.btn-soft{
border:1px solid
rgba(13,110,253,.15);
background:#fff;
color:var(--primary);
}
.hero{
padding:90px 0 70px;
}
.hero-card{
background:#fff;
border-radius:28px;
box-shadow:var(--shadow);
padding:45px;
}
.section{
padding:70px 0;
}
footer{
background:#0b1220;
color:#fff;
padding:35px 0 20px;
margin-top:50px;
}
.install-btn-wrap{
position:fixed;
right:18px;
bottom:18px;
z-index:9999;
}
#installAppBtn{
display:none;
border:none;
border-radius:999px;
padding:14px 18px;
font-weight:700;
box-shadow:0 10px 35px
rgba(13,110,253,.30);
}
.offline-badge{
position:fixed;
left:18px;
bottom:18px;
z-index:9999;
display:none;
background:#dc3545;
color:#fff;
padding:10px 16px;
border-radius:999px;
font-weight:700;
}
</style>
</head>
<body>
<nav class="navbar navbar-expand-lg sticky-top">
<div class="container py-2
d-flex justify-content-between align-items-center">
<a class="navbar-brand
d-flex align-items-center gap-3" href="#">
<img
src="logo-header.png" alt="<?php echo
htmlspecialchars($company_name, ENT_QUOTES, 'UTF-8'); ?>"
style="height:56px; width:auto; border-radius:10px;">
<div>
<div><?php echo
htmlspecialchars($company_name, ENT_QUOTES, 'UTF-8'); ?></div>
<small
class="text-muted fw-semibold">Trusted Financial Growth
Partner</small>
</div>
</a>
<div class="d-flex gap-2">
<a href="<?php
echo htmlspecialchars($login_url, ENT_QUOTES, 'UTF-8'); ?>"
class="btn btn-main nav-btn">
Login
</a>
<a
href="#contact" class="btn btn-soft nav-btn">
Contact
</a>
</div>
</div>
</nav>
<section class="hero">
<div
class="container">
<div
class="hero-card">
<h1>Welcome to <?php
echo htmlspecialchars($company_name, ENT_QUOTES, 'UTF-8'); ?></h1>
<p>
We provide simple, fast, and professional
microfinance services for individuals,
entrepreneurs, and
growing businesses.
</p>
<div class="d-flex
flex-wrap gap-3 mt-4">
<a href="<?php
echo htmlspecialchars($login_url, ENT_QUOTES, 'UTF-8'); ?>"
class="btn btn-main">Login Now</a>
<a href="<?php
echo htmlspecialchars($dashboard_url, ENT_QUOTES, 'UTF-8'); ?>"
class="btn btn-soft">Open Dashboard</a>
</div>
</div>
</div>
</section>
<section class="section" id="contact">
<div
class="container">
<h2>Contact &
🚀 Unahitaji mfumo au website ya biashara?
Chagua huduma hapa chini kisha mteja bofya moja kwa moja kwenda kwenye ukurasa wa huduma au kuwasiliana nasi kwa WhatsApp.