<?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: Devonte Johnson</title>
    <description>The latest articles on DEV Community by Devonte Johnson (@devonte_johnson_6767).</description>
    <link>https://dev.to/devonte_johnson_6767</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%2F3880485%2F1995693d-d41d-4594-8647-71d6ad20e8cc.png</url>
      <title>DEV Community: Devonte Johnson</title>
      <link>https://dev.to/devonte_johnson_6767</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/devonte_johnson_6767"/>
    <language>en</language>
    <item>
      <title>Two Way Order Update System</title>
      <dc:creator>Devonte Johnson</dc:creator>
      <pubDate>Wed, 15 Apr 2026 22:28:26 +0000</pubDate>
      <link>https://dev.to/devonte_johnson_6767/two-way-order-update-system-eem</link>
      <guid>https://dev.to/devonte_johnson_6767/two-way-order-update-system-eem</guid>
      <description>&lt;p&gt;`✅ 1. PRODUCER – Update Order Status&lt;br&gt;
HTML (producer dashboard)&lt;br&gt;
{% for o in orders %}&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;p&amp;gt;{{ o.name }} x{{ o.qty }}&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Status: {{ o.status }}&amp;lt;/p&amp;gt;

{% if o.status == 'pending' %}
    Mark as Shipped
    Cancel
{% endif %}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;{% endfor %}&lt;br&gt;
JavaScript&lt;br&gt;
function updateStatus(id, status) {&lt;br&gt;
    fetch('/update_order_status', {&lt;br&gt;
        method: 'POST',&lt;br&gt;
        headers: { 'Content-Type': 'application/json' },&lt;br&gt;
        body: JSON.stringify({ id: id, status: status })&lt;br&gt;
    })&lt;br&gt;
    .then(res =&amp;gt; res.json())&lt;br&gt;
    .then(data =&amp;gt; {&lt;br&gt;
        if (data.success) location.reload();&lt;br&gt;
    });&lt;br&gt;
}&lt;br&gt;
Flask&lt;br&gt;
@app.route('/update_order_status', methods=['POST'])&lt;br&gt;
def update_order_status():&lt;br&gt;
    if session.get('role') != 'producer':&lt;br&gt;
        return {'success': False}&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;data = request.get_json()

q("""
    UPDATE order_items
    SET status=%s
    WHERE id=%s
""", (data['status'], data['id']), write=True)

return {'success': True}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;✅ 2. PRODUCER – Upload New Product&lt;br&gt;
HTML&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Add Product
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Flask&lt;br&gt;
@app.route('/add_product', methods=['POST'])&lt;br&gt;
def add_product():&lt;br&gt;
    if session.get('role') != 'producer':&lt;br&gt;
        return redirect('/')&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;q("""
    INSERT INTO products(name, price, producer_id)
    VALUES(%s,%s,%s)
""", (
    request.form['name'],
    request.form['price'],
    session['uid']
), write=True)

return redirect('/producer')
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;✅ 3. CUSTOMER – Cancel Order&lt;br&gt;
HTML (customer dashboard)&lt;br&gt;
{% for o in orders %}&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;p&amp;gt;{{ o.name }} x{{ o.qty }}&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Status: {{ o.status }}&amp;lt;/p&amp;gt;

{% if o.status == 'pending' %}
    Cancel
{% endif %}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;{% endfor %}&lt;br&gt;
JavaScript&lt;br&gt;
function cancelOrder(id) {&lt;br&gt;
    fetch('/cancel_order', {&lt;br&gt;
        method: 'POST',&lt;br&gt;
        headers: { 'Content-Type': 'application/json' },&lt;br&gt;
        body: JSON.stringify({ id: id })&lt;br&gt;
    })&lt;br&gt;
    .then(res =&amp;gt; res.json())&lt;br&gt;
    .then(data =&amp;gt; {&lt;br&gt;
        if (data.success) location.reload();&lt;br&gt;
    });&lt;br&gt;
}&lt;br&gt;
Flask&lt;br&gt;
@app.route('/cancel_order', methods=['POST'])&lt;br&gt;
def cancel_order():&lt;br&gt;
    if not session.get('uid'):&lt;br&gt;
        return {'success': False}&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;data = request.get_json()

# ensure customer owns the order
q("""
    UPDATE order_items oi
    JOIN orders o ON oi.order_id = o.id
    SET oi.status='cancelled'
    WHERE oi.id=%s AND o.customer_id=%s
""", (data['id'], session['uid']), write=True)

return {'success': True}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;✅ 4. CSS (status colours)&lt;br&gt;
.order {&lt;br&gt;
    padding: 10px;&lt;br&gt;
    margin: 10px 0;&lt;br&gt;
    color: white;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;.order.pending { background: orange; }&lt;br&gt;
.order.shipped { background: green; }&lt;br&gt;
.order.cancelled { background: red; }`&lt;/p&gt;

</description>
      <category>html</category>
      <category>javascript</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to Update/Cancel Orders using SQL</title>
      <dc:creator>Devonte Johnson</dc:creator>
      <pubDate>Wed, 15 Apr 2026 22:26:18 +0000</pubDate>
      <link>https://dev.to/devonte_johnson_6767/how-to-updatecancel-orders-using-sql-7k4</link>
      <guid>https://dev.to/devonte_johnson_6767/how-to-updatecancel-orders-using-sql-7k4</guid>
      <description>&lt;p&gt;`You’re basically asking two things:&lt;/p&gt;

&lt;p&gt;How to update order status (cancel)&lt;br&gt;
How to reflect that visually (colour, etc.)&lt;/p&gt;

&lt;p&gt;Let’s do it clean and exam-ready.&lt;/p&gt;

&lt;p&gt;✅ 1. Button → send request to Flask&lt;br&gt;
HTML (pass order item ID)&lt;br&gt;
Cancel Order&lt;br&gt;
JavaScript&lt;br&gt;
function cancelOrder(id) {&lt;br&gt;
    fetch('/cancel_order', {&lt;br&gt;
        method: 'POST',&lt;br&gt;
        headers: { 'Content-Type': 'application/json' },&lt;br&gt;
        body: JSON.stringify({ id: id })&lt;br&gt;
    })&lt;br&gt;
    .then(res =&amp;gt; res.json())&lt;br&gt;
    .then(data =&amp;gt; {&lt;br&gt;
        if (data.success) {&lt;br&gt;
            location.reload(); // simplest for exam&lt;br&gt;
        }&lt;br&gt;
    });&lt;br&gt;
}&lt;br&gt;
✅ 2. Flask route (update DB)&lt;br&gt;
@app.route('/cancel_order', methods=['POST'])&lt;br&gt;
def cancel_order():&lt;br&gt;
    if not session.get('uid'):&lt;br&gt;
        return {'success': False}&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;data = request.get_json()

# IMPORTANT: make sure user owns this order
q("""
    UPDATE order_items 
    SET status='cancelled'
    WHERE id=%s
""", (data['id'],), write=True)

return {'success': True}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;✅ 3. Display status in HTML&lt;br&gt;
Example (dashboard.html)&lt;br&gt;
{% for o in orders %}&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;p&amp;gt;{{ o.name }} x{{ o.qty }}&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Status: {{ o.status }}&amp;lt;/p&amp;gt;

{% if o.status == 'pending' %}
    Cancel Order
{% endif %}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;{% endfor %}&lt;br&gt;
✅ 4. CSS (this is what you want)&lt;br&gt;
.order {&lt;br&gt;
    padding: 10px;&lt;br&gt;
    margin-bottom: 10px;&lt;br&gt;
    color: white;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;.order.pending {&lt;br&gt;
    background-color: orange;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;.order.cancelled {&lt;br&gt;
    background-color: red;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;.order.shipped {&lt;br&gt;
    background-color: green;&lt;br&gt;
}&lt;br&gt;
🧠 Key idea (what examiner wants)&lt;/p&gt;

&lt;p&gt;Instead of using status=1, you’re better off using:&lt;/p&gt;

&lt;p&gt;pending / cancelled / shipped&lt;/p&gt;

&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;Easier to read&lt;br&gt;
Easier to style&lt;br&gt;
Easier to explain&lt;br&gt;
⚠️ If you REALLY want numbers&lt;br&gt;
DB:&lt;br&gt;
0 = pending&lt;br&gt;
1 = cancelled&lt;br&gt;
2 = shipped&lt;br&gt;
HTML:&lt;br&gt;
&lt;/p&gt;
&lt;br&gt;
🔥 Cleaner (recommended)

&lt;p&gt;Just store text:&lt;/p&gt;

&lt;p&gt;status VARCHAR(20)&lt;br&gt;
✅ What you now have&lt;/p&gt;

&lt;p&gt;✔ Button → sends request&lt;br&gt;
✔ Flask updates DB&lt;br&gt;
✔ Page reloads&lt;br&gt;
✔ Status changes colour`&lt;/p&gt;

</description>
      <category>webdev</category>
    </item>
    <item>
      <title>Creating Accounts</title>
      <dc:creator>Devonte Johnson</dc:creator>
      <pubDate>Wed, 15 Apr 2026 12:28:31 +0000</pubDate>
      <link>https://dev.to/devonte_johnson_6767/creating-accounts-1mpl</link>
      <guid>https://dev.to/devonte_johnson_6767/creating-accounts-1mpl</guid>
      <description>&lt;p&gt;`from flask import Flask, request, redirect, session, flash&lt;br&gt;
import bcrypt&lt;br&gt;
import mysql.connector&lt;/p&gt;

&lt;p&gt;app = Flask(&lt;strong&gt;name&lt;/strong&gt;)&lt;br&gt;
app.secret_key = "secret"&lt;/p&gt;

&lt;h1&gt;
  
  
  CREATE CONNECTION (important: autocommit OFF, we handle it)
&lt;/h1&gt;

&lt;p&gt;conn = mysql.connector.connect(&lt;br&gt;
    host="localhost",&lt;br&gt;
    user="root",&lt;br&gt;
    password="password",&lt;br&gt;
    database="your_db"&lt;br&gt;
)&lt;/p&gt;

&lt;h1&gt;
  
  
  QUERY FUNCTION (FIXED)
&lt;/h1&gt;

&lt;p&gt;def q(sql, params=(), one=False, write=False):&lt;br&gt;
    cur = conn.cursor(dictionary=True)&lt;br&gt;
    cur.execute(sql, params)&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if write:
    conn.commit()   # ✅ ensure commit
    cur.close()
    return True

result = cur.fetchone() if one else cur.fetchall()
cur.close()
return result
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;@app.route('/login', methods=['POST'])&lt;br&gt;
def login():&lt;br&gt;
    user = q(&lt;br&gt;
        "SELECT * FROM users WHERE email=%s",&lt;br&gt;
        (request.form['email'],),&lt;br&gt;
        one=True&lt;br&gt;
    )&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if user:
    # DEBUG check (optional)
    print("DB HASH:", user['password_hash'])

if user and bcrypt.checkpw(
    request.form['password'].encode(),
    user['password_hash'].encode()
):
    session['uid'] = user['id']
    session['name'] = f"{user['first_name']} {user['last_name']}"
    session['role'] = user['role']

    return redirect('/')

flash('Invalid credentials', 'error')
return redirect('/')
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;@app.route('/register', methods=['POST'])&lt;br&gt;
def register():&lt;br&gt;
    hashed = bcrypt.hashpw(&lt;br&gt;
        request.form['password'].encode(),&lt;br&gt;
        bcrypt.gensalt()&lt;br&gt;
    ).decode()&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;try:
    q(
        "INSERT INTO users(first_name,last_name,email,password_hash,role) VALUES(%s,%s,%s,%s,%s)",
        (
            request.form['first_name'],
            request.form['last_name'],
            request.form['email'],
            hashed,
            'customer'
        ),
        write=True
    )
    print("USER INSERTED")  # ✅ debug

except Exception as e:
    print("ERROR:", e)  # ✅ SHOW REAL ERROR
    flash('Email taken or DB error', 'error')
    return redirect('/')

flash('Account created', 'success')
return redirect('/')
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;@app.route('/logout')&lt;br&gt;
def logout():&lt;br&gt;
    session.clear()&lt;br&gt;
    return redirect('/')`&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to Make a Product and Cart Page Using SQL</title>
      <dc:creator>Devonte Johnson</dc:creator>
      <pubDate>Wed, 15 Apr 2026 12:25:46 +0000</pubDate>
      <link>https://dev.to/devonte_johnson_6767/how-to-make-a-product-and-cart-page-using-sql-59e2</link>
      <guid>https://dev.to/devonte_johnson_6767/how-to-make-a-product-and-cart-page-using-sql-59e2</guid>
      <description>&lt;p&gt;`To make this work across multiple pages (products page + cart page) using an external JS file, you mainly need to:&lt;/p&gt;

&lt;p&gt;Keep using localStorage (you already are ✅)&lt;br&gt;
Move your JS into a separate file&lt;br&gt;
Make sure both pages include that script&lt;br&gt;
Pass product data from your SQL-loaded HTML into addToCart()&lt;br&gt;
✅ 1. Create external JS file&lt;/p&gt;

&lt;p&gt;static/js/cart.js&lt;/p&gt;

&lt;p&gt;let cart = JSON.parse(localStorage.getItem('cart')) || [];&lt;/p&gt;

&lt;p&gt;function saveCart() {&lt;br&gt;
    localStorage.setItem('cart', JSON.stringify(cart));&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;function addToCart(id, name, price) {&lt;br&gt;
    const existing = cart.find(item =&amp;gt; item.id === id);&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (existing) {
    existing.qty += 1;
} else {
    cart.push({ id, name, price, qty: 1 });
}

saveCart();
renderCart();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;function removeFromCart(id) {&lt;br&gt;
    cart = cart.filter(item =&amp;gt; item.id !== id);&lt;br&gt;
    saveCart();&lt;br&gt;
    renderCart();&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;function renderCart() {&lt;br&gt;
    const cartBox = document.getElementById('cart-items');&lt;br&gt;
    const totalBox = document.getElementById('cart-total');&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (!cartBox || !totalBox) return; // IMPORTANT (prevents errors on other pages)

cartBox.innerHTML = '';
let total = 0;

cart.forEach(item =&amp;gt; {
    total += item.price * item.qty;

    const div = document.createElement('div');
    div.className = 'cart-item';
    div.innerHTML = `
        &amp;lt;span&amp;gt;${item.name} x${item.qty}&amp;lt;/span&amp;gt;
        &amp;lt;span&amp;gt;£${(item.price * item.qty).toFixed(2)}&amp;lt;/span&amp;gt;
        &amp;lt;button onclick="removeFromCart(${item.id})"&amp;gt;✕&amp;lt;/button&amp;gt;
    `;
    cartBox.appendChild(div);
});

totalBox.innerText = 'Total: £' + total.toFixed(2);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;document.addEventListener('DOMContentLoaded', renderCart);&lt;br&gt;
✅ 2. Include it on BOTH pages&lt;br&gt;
Products page:&lt;/p&gt;

&lt;p&gt;Cart page:&lt;/p&gt;

&lt;p&gt;✅ 3. Products page (data from SQL)&lt;/p&gt;

&lt;p&gt;In your Flask route:&lt;/p&gt;

&lt;p&gt;products = q("SELECT * FROM products")&lt;br&gt;
return render_template("products.html", products=products)&lt;br&gt;
In your products.html&lt;br&gt;
{% for p in products %}&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;p&amp;gt;{{ p.name }} - £{{ p.price }}&amp;lt;/p&amp;gt;

    Add to Cart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;{% endfor %}&lt;br&gt;
⚠️ Important fix (very important)&lt;/p&gt;

&lt;p&gt;If product names can have quotes, use this safer version:&lt;/p&gt;

&lt;p&gt;&lt;br&gt;
✅ 4. Cart page&lt;/p&gt;

&lt;h2&gt;Your Cart&lt;/h2&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;h3 id="cart-total"&amp;gt;Total: £0.00&amp;lt;/h3&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;✅ How it works now&lt;br&gt;
Products page → adds items to localStorage&lt;br&gt;
Cart page → reads same localStorage&lt;br&gt;
renderCart() runs on both pages&lt;br&gt;
No backend needed for cart (yet)&lt;br&gt;
🔥 Optional upgrades (tell me if you want)&lt;br&gt;
Quantity +/- buttons&lt;br&gt;
Persist cart to database (for logged-in users)&lt;br&gt;
Cart icon with item count&lt;br&gt;
Stripe checkout&lt;/p&gt;

&lt;p&gt;If something doesn’t work, it’s usually one of these:&lt;/p&gt;

&lt;p&gt;Wrong script path (/static/js/cart.js)&lt;br&gt;
Missing tojson filter&lt;br&gt;
IDs not matching&lt;/p&gt;

&lt;p&gt;Paste your HTML if you want me to debug it directly.`&lt;/p&gt;

</description>
      <category>webdev</category>
    </item>
  </channel>
</rss>
