1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | #\controllers\customer.py import config, re, json from bottle import template, route, request, redirect from models import customerdb @route ( '/customer' ) def displayCustomer(): config.kargs[ 'customers' ] = json.dumps(customerdb.select()) return template( 'customer' , data = config.kargs) @route ( '/custform' ) def getCustomerForm(): return template( 'custform' , data = config.kargs) @route ( '/custform/edit/<id>' ) def editCustomerForm( id ): config.kargs[ 'rowedit' ] = customerdb.edit( id ) config.kargs[ 'id' ] = id return template( 'custform' , data = config.kargs) @route ( "/customer/delete/<id>" ) def deleteCustomer( id ): config.kargs[ 'id' ] = id customerdb.delete( id ) redirect( '/customer' ) @route ( "/customer/<key>/<index>" ) def sortCustomer(key, index): config.kargs[ 'customers' ] = json.dumps(customerdb.sort(key)) config.kargs[ 'sortIndex' ] = index return template( 'customer' , data = config.kargs) @route ( '/customer' , method = "POST" ) def getFormData(): name = request.forms.get( "fname" ) phone = request.forms.get( "fphone" ) if not re.match(r "^(\+\d{1,2}\s?)?1?\-?\.?\s?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$" , phone): config.kargs[ 'message' ] = "You need to enter a right phone number." return template( 'custform' , data = config.kargs) else : if 'rowedit' in config.kargs: customerdb.update(name, phone, config.kargs[ 'id' ]) del config.kargs[ 'rowedit' ] redirect( '/customer' ) else : customerdb.insert(name, phone) redirect( '/customer' ) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | #\models\customerdb.py import sqlite3 def insert( * customer): conn = sqlite3.connect( 'sqlite.db' ) cursor = conn.cursor() sql = '''CREATE TABLE IF NOT EXISTS CUSTOMER( NAME TEXT, PHONE TEXT ) ''' cursor.execute(sql) cursor.execute( "INSERT INTO CUSTOMER VALUES (?, ?)" , customer) conn.commit() conn.close() def select(): conn = sqlite3.connect( 'sqlite.db' ) cursor = conn.cursor() sql = '''CREATE TABLE IF NOT EXISTS CUSTOMER( NAME TEXT, PHONE TEXT ) ''' cursor.execute(sql) cursor.execute( "SELECT ROWID, * from CUSTOMER" ) customers = cursor.fetchall() conn.commit() conn.close() return customers def edit( id ): conn = sqlite3.connect( 'sqlite.db' ) cursor = conn.cursor() cursor.execute( "SELECT ROWID, * from CUSTOMER WHERE ROWID = " + id ) customer = cursor.fetchone() conn.commit() conn.close() return customer def update( * args): conn = sqlite3.connect( 'sqlite.db' ) cursor = conn.cursor() sql = "UPDATE CUSTOMER SET NAME=?, PHONE=? WHERE ROWID=?" cursor.execute(sql, args) conn.commit() conn.close() def delete( id ): conn = sqlite3.connect( 'sqlite.db' ) cursor = conn.cursor() cursor.execute( "DELETE FROM CUSTOMER WHERE ROWID=?" , ( id ,)) conn.commit() conn.close() def sort(key): conn = sqlite3.connect( 'sqlite.db' ) cursor = conn.cursor() cursor.execute( "SELECT ROWID, * from CUSTOMER ORDER BY " + key) customers = cursor.fetchall() conn.commit() conn.close() return customers |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <!--\views\customer.tpl--> %include("./partials/header.tpl") < div class = "main" id = "main" > < div class = "content" id = "content" > < div class = "top-widget" > < span >CUSTOMERS</ span >< input onclick = "location.href='/custform'" type = "button" value = "Add Customer" /> </ div > < div class = "bottom-widget" > < span > < select id = "custkey" > < option value = "Name" >Name</ option > < option value = "Phone" >Phone</ option > </ select > < input onclick = "bicycle.sortCustomer()" type = "button" value = "Sort" /> </ span > </ div > <!--bottom-widget--> < div id = "table" ></ div > < script >bicycle.showCustomer({{!data['customers']}}, {{!data['sortIndex']}})</ script > </ div > <!--content--> </ div > <!--main--> %include("./partials/footer") |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | //\public\js\main.js class Bicycle{ customerForm(formId){ var name = document.forms[formId][ 'fname' ].value; var phone = document.forms[formId][ 'fphone' ].value; if ((name == "" ) || (phone == "" )){ alert( "Please fill this form with your name and phone number!" ); return false ; } else { var phoneRegex = /^(\+\d{1,2}\s?)?1?\-?\.?\s?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$/; var numberResult = phoneRegex.test(phone); if (!numberResult){ alert( "Please fill this form with the right phone number." ); return false ; } } } showCustomer(customers, sortIndex){ var html = '' ; if (customers.length > 0){ html += "<table>" ; html += "<tr>" ; for ( var k in {id:0, name:0, phone:0}){ html += "<th>" + k.toUpperCase() + "</th>" ; } html += "<th>OPTION</th>" ; html += "</tr>" ; for ( var i=0; i<customers.length; i++){ html += "<tr>" ; html += "<td>" + (i+1) + "</td>" ; for ( var j in customers[i]){ if (j > 0) html += "<td>" + customers[i][j] + "</td>" ; } html += `<td class= "option" ><a href= "/custform/edit/${customers[i][0]}" class= "edit" >Edit</a>|<a href= "/customer/delete/${customers[i][0]}" class= "delete" >Delete</a></td>`; html += "</tr>" ; } html += "</table>" ; } document.getElementById( "table" ).innerHTML = html; document.getElementById( "custkey" ).selectedIndex = sortIndex; } sortCustomer(){ var element = document.getElementById( "custkey" ); var sortIndex = element.selectedIndex; var key = element.options[sortIndex].value; window.location.href = "/customer/" + key + "/" + sortIndex; } } //end of class var bicycle = new Bicycle(); |
GitHub: https://github.com/Sokhavuth/Rental-Bicycle-App
Heroku: https://khmerweb-rba.herokuapp.com/