<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: liz nzisa</title>
    <description>The latest articles on DEV Community by liz nzisa (@liz_nzisa_ac2b0175672cd1c).</description>
    <link>https://dev.to/liz_nzisa_ac2b0175672cd1c</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2039089%2F5da33de7-ee36-44be-af2c-591f6afeadc6.png</url>
      <title>DEV Community: liz nzisa</title>
      <link>https://dev.to/liz_nzisa_ac2b0175672cd1c</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/liz_nzisa_ac2b0175672cd1c"/>
    <language>en</language>
    <item>
      <title>Step by step guide to build an app using :1.next.js 2.django.</title>
      <dc:creator>liz nzisa</dc:creator>
      <pubDate>Mon, 16 Sep 2024 14:10:16 +0000</pubDate>
      <link>https://dev.to/swahilipotdevs/project-documentation-finance-app-and-polling-appnextjs-finance-app-5fk8</link>
      <guid>https://dev.to/swahilipotdevs/project-documentation-finance-app-and-polling-appnextjs-finance-app-5fk8</guid>
      <description>&lt;p&gt;project Documentation: Next.js Finance App &amp;amp; Django Polling App&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Next.js Finance App
&lt;/h2&gt;

&lt;p&gt;Project Overview&lt;/p&gt;

&lt;p&gt;This project is a finance application built using Next.js. It allows users to log in, view invoices, collected amounts, add or edit customers, and view customer and invoice pages. It also provides a recent revenue summary for financial tracking.&lt;/p&gt;

&lt;p&gt;The app uses PostgreSQL as the primary database, enhanced with MySQL logic for optimized queries. The app is successfully deployed on Vercel.&lt;br&gt;
**&lt;br&gt;
 &lt;strong&gt;Features&lt;/strong&gt;&lt;br&gt;
    Authentication: Secure login system to access personal accounts.&lt;br&gt;
    Invoice Management: View, edit, and manage invoices and track the total amount collected.&lt;br&gt;
    Customer Management: Add, view, and edit customer information.&lt;br&gt;
    Revenue Summary: View the most recent revenue generated from customer invoices.&lt;br&gt;
    Database: PostgreSQL integrated with MySQL logic.&lt;br&gt;
    Deployment: Deployed on Vercel.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Installation&lt;/strong&gt;&lt;br&gt;
Step 1: Install Node.js and Next.js&lt;/p&gt;

&lt;p&gt;Install Node.js&lt;br&gt;
&lt;code&gt;sudo apt update&lt;br&gt;
sudo apt install nodejs&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Install Next.js and create a new project&lt;br&gt;
&lt;code&gt;npx create-next-app@latest finance-app&lt;br&gt;
cd finance-app&lt;br&gt;
npm install&lt;/code&gt;`&lt;/p&gt;

&lt;p&gt;Step 2: Install PostgreSQL&lt;/p&gt;

&lt;p&gt;Install PostgreSQL&lt;br&gt;
&lt;code&gt;sudo apt update&lt;br&gt;
sudo apt install postgresql postgresql-contrib&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Start PostgreSQL&lt;br&gt;
&lt;code&gt;sudo service postgresql start&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Step 3: Setup MySQL (Optional for Logic)&lt;/p&gt;

&lt;p&gt;Install MySQL&lt;br&gt;
&lt;code&gt;sudo apt install mysql-server&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Start MySQL&lt;br&gt;
&lt;code&gt;sudo service mysql start&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Step 4: Run Development Server&lt;/p&gt;

&lt;p&gt;Start the Next.js development server&lt;br&gt;
&lt;code&gt;npm run dev&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Key Concepts&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Routing&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Next.js provides a file-based routing system. The app has routes for invoices, customers, and revenue pages:&lt;/p&gt;

&lt;p&gt;js&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;// Example: Invoice route in pages/invoices/[id].js&lt;br&gt;
import { useRouter } from 'next/router';&lt;/p&gt;

&lt;p&gt;export default function InvoicePage() {&lt;br&gt;
    const router = useRouter();&lt;br&gt;
    const { id } = router.query;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;return &amp;lt;div&amp;gt;Invoice ID: {id}&amp;lt;/div&amp;gt;;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;code&gt;&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Data Fetching&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Server-side rendering (SSR) with getServerSideProps ensures real-time data updates for viewing recent revenue and invoice details:&lt;/p&gt;

&lt;p&gt;js&lt;br&gt;
&lt;code&gt;&lt;/code&gt;&lt;br&gt;
export async function getServerSideProps() {&lt;br&gt;
    const invoices = await fetchInvoicesFromDB();&lt;br&gt;
    return { props: { invoices } };&lt;br&gt;
}&lt;code&gt;&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Form Validation&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Using react-hook-form and yup for form validation when adding/editing customer information:&lt;/p&gt;

&lt;p&gt;js&lt;/p&gt;

&lt;p&gt;`import { useForm } from 'react-hook-form';&lt;br&gt;
import * as yup from 'yup';&lt;/p&gt;

&lt;p&gt;const schema = yup.object().shape({&lt;br&gt;
  customerName: yup.string().required(),&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;export default function AddCustomer() {&lt;br&gt;
  const { register, handleSubmit } = useForm({&lt;br&gt;
    validationSchema: schema,&lt;br&gt;
  });&lt;/p&gt;

&lt;p&gt;const onSubmit = data =&amp;gt; console.log(data);&lt;/p&gt;

&lt;p&gt;return (&lt;br&gt;
    &lt;/p&gt;
&lt;br&gt;
      &lt;br&gt;
      Submit&lt;br&gt;
    &lt;br&gt;
  );&lt;br&gt;
}`

&lt;ol&gt;
&lt;li&gt;Error Handling&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Handled via custom error pages (404.js, 500.js) to enhance the user experience:&lt;/p&gt;

&lt;p&gt;js&lt;/p&gt;

&lt;p&gt;&lt;code&gt;export default function Custom404() {&lt;br&gt;
  return &amp;lt;h1&amp;gt;404 - Page Not Found&amp;lt;/h1&amp;gt;;&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Authentication&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Implemented using NextAuth.js to secure login functionality:&lt;/p&gt;

&lt;p&gt;js&lt;br&gt;
&lt;code&gt;&lt;/code&gt;&lt;br&gt;
`import { signIn, useSession } from 'next-auth/react';&lt;/p&gt;

&lt;p&gt;export default function Login() {&lt;br&gt;
  const { data: session } = useSession();&lt;/p&gt;

&lt;p&gt;if (session) {&lt;br&gt;
    return &lt;/p&gt;
&lt;p&gt;Welcome {session.user.email}&lt;/p&gt;;&lt;br&gt;
  }

&lt;p&gt;return  signIn()}&amp;gt;Sign In;&lt;br&gt;
}&lt;br&gt;
``&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Styling&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Styled using Tailwind CSS for responsive and modern UI design:&lt;/p&gt;

&lt;p&gt;html&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;div className="bg-gray-200 p-4"&amp;gt;&lt;br&gt;
    &amp;lt;h1 className="text-2xl font-bold"&amp;gt;Recent Revenue&amp;lt;/h1&amp;gt;&lt;br&gt;
    &amp;lt;p&amp;gt;Total Revenue: $5000&amp;lt;/p&amp;gt;&lt;br&gt;
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Meta Data &amp;amp; SEO&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Handled through the Next.js &lt;/p&gt; component for SEO:

&lt;p&gt;js&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;Head&amp;gt;&lt;br&gt;
  &amp;lt;title&amp;gt;Finance App - Recent Revenue&amp;lt;/title&amp;gt;&lt;br&gt;
  &amp;lt;meta name="description" content="View your recent revenue and manage invoices" /&amp;gt;&lt;br&gt;
&amp;lt;/Head&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Django Polling App
Project Overview&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This project is a polling application created using Django. It allows users to vote on polls and view poll results. The admin interface enables the creation, modification, and deletion of polls.&lt;/p&gt;

&lt;p&gt;The project features two models: Question and Choice. Each Question has associated Choices for users to vote on, and each Choice tracks the number of votes.&lt;br&gt;
Features&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Public Polling: Allows users to view and vote on polls.
Admin Interface: Manage polls, add questions, and track votes.
Models:
    Question model with the question text and publication date.
    Choice model with the choice text and vote count, linked to Question.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Installation&lt;br&gt;
Step 1: Install Python and Django&lt;/p&gt;

&lt;p&gt;bash&lt;/p&gt;

&lt;p&gt;Install Python&lt;br&gt;
&lt;code&gt;sudo apt update&lt;br&gt;
sudo apt install python3&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Install Django&lt;br&gt;
&lt;code&gt;pip install django&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Step 2: Create a Django Project&lt;/p&gt;

&lt;p&gt;&lt;code&gt;django-admin startproject polls_project&lt;br&gt;
cd polls_project&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Start Django development server
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;python manage.py runserver&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Step 3: Setup Database (SQLite by default)&lt;/p&gt;

&lt;p&gt;Migrate to initialize database&lt;br&gt;
&lt;code&gt;python manage.py migrate&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Step 4: Create Polling Models&lt;/p&gt;

&lt;p&gt;python&lt;/p&gt;

&lt;p&gt;models.py&lt;br&gt;
from django.db import models&lt;/p&gt;

&lt;p&gt;class Question(models.Model):&lt;br&gt;
    question_text = models.CharField(max_length=200)&lt;br&gt;
    pub_date = models.DateTimeField('date published')&lt;/p&gt;

&lt;p&gt;class Choice(models.Model):&lt;br&gt;
    question = models.ForeignKey(Question, on_delete=models.CASCADE)&lt;br&gt;
    choice_text = models.CharField(max_length=200)&lt;br&gt;
    votes = models.IntegerField(default=0)`&lt;/p&gt;

&lt;p&gt;Key Concepts&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Routing&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Django's URL routing mechanism is used for linking views with URLs:&lt;/p&gt;

&lt;p&gt;python&lt;br&gt;
` urls.py&lt;br&gt;
from django.urls import path&lt;br&gt;
from . import views&lt;/p&gt;

&lt;p&gt;urlpatterns = [&lt;br&gt;
    path('', views.index, name='index'),&lt;br&gt;
    path('&lt;a&gt;int:question_id&lt;/a&gt;/', views.detail, name='detail'),&lt;br&gt;
    path('&lt;a&gt;int:question_id&lt;/a&gt;/vote/', views.vote, name='vote'),&lt;br&gt;
]&lt;br&gt;
`&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Form Validation&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Form validation is used when submitting votes, ensuring that valid data is submitted:&lt;/p&gt;

&lt;p&gt;python&lt;/p&gt;

&lt;p&gt;`forms.py&lt;br&gt;
from django import forms&lt;/p&gt;

&lt;p&gt;class VoteForm(forms.Form):&lt;br&gt;
    choice = forms.ChoiceField(choices=[(choice.id, choice.choice_text) for choice in choices])`&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Admin Interface&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The Django admin panel is used to manage questions and choices:&lt;/p&gt;

&lt;p&gt;python&lt;br&gt;
`&lt;br&gt;
from django.contrib import admin&lt;br&gt;
from .models import Question, Choice&lt;/p&gt;

&lt;p&gt;admin.site.register(Question)&lt;br&gt;
admin.site.register(Choice)`&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Error Handling&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Custom error messages are displayed if an invalid poll or vote is submitted:&lt;/p&gt;

&lt;p&gt;python&lt;/p&gt;

&lt;p&gt;&lt;code&gt;def vote(request, question_id):&lt;br&gt;
    try:&lt;br&gt;
        question = get_object_or_404(Question, pk=question_id)&lt;br&gt;
    except KeyError:&lt;br&gt;
        return render(request, 'polls/detail.html', {'error_message': "You didn't select a choice."})&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Styling&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The app uses Bootstrap for a clean, responsive interface:&lt;/p&gt;

&lt;p&gt;html&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;div class="container"&amp;gt;&lt;br&gt;
    &amp;lt;h1&amp;gt;Poll Results&amp;lt;/h1&amp;gt;&lt;br&gt;
    &amp;lt;p&amp;gt;{{ question.question_text }}&amp;lt;/p&amp;gt;&lt;br&gt;
&amp;lt;/div&amp;gt;&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Meta Data&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Meta tags are used to improve SEO:&lt;/p&gt;

&lt;p&gt;html&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;meta name="description" content="Vote on the latest polls and view poll results."&amp;gt;&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>example</title>
      <dc:creator>liz nzisa</dc:creator>
      <pubDate>Mon, 16 Sep 2024 13:50:07 +0000</pubDate>
      <link>https://dev.to/swahilipotdevs/example-44kh</link>
      <guid>https://dev.to/swahilipotdevs/example-44kh</guid>
      <description></description>
    </item>
  </channel>
</rss>
