From 69174e9d1e20748d1f61cea657aec3ac318588cd Mon Sep 17 00:00:00 2001 From: Simon Mok Date: Mon, 9 Jul 2018 01:01:11 +0800 Subject: [PATCH] Initial commit --- admin.html | 19 +++ bs-config.json | 4 + certificate.html | 38 ++++++ contracts/Master.sol | 238 +++++++++++++++++++++++++++++++++++++ deploy-contract.js | 33 +++++ images/cert-template.gif | Bin 0 -> 104587 bytes images/certificate.ico | Bin 0 -> 8481 bytes index.html | 20 ++++ issuer-certificates.html | 57 +++++++++ issuer-list.html | 33 +++++ issuer.html | 38 ++++++ js/certificate.js | 52 ++++++++ js/issuer-certificates.js | 50 ++++++++ js/issuer-list.js | 29 +++++ js/issuer.js | 45 +++++++ js/search.js | 47 ++++++++ js/student-certificates.js | 49 ++++++++ js/student-list.js | 30 +++++ js/student.js | 43 +++++++ package.json | 19 +++ search.html | 56 +++++++++ student-certificates.html | 56 +++++++++ student-list.html | 31 +++++ student.html | 32 +++++ 24 files changed, 1019 insertions(+) create mode 100644 admin.html create mode 100644 bs-config.json create mode 100644 certificate.html create mode 100644 contracts/Master.sol create mode 100644 deploy-contract.js create mode 100644 images/cert-template.gif create mode 100644 images/certificate.ico create mode 100644 index.html create mode 100644 issuer-certificates.html create mode 100644 issuer-list.html create mode 100644 issuer.html create mode 100644 js/certificate.js create mode 100644 js/issuer-certificates.js create mode 100644 js/issuer-list.js create mode 100644 js/issuer.js create mode 100644 js/search.js create mode 100644 js/student-certificates.js create mode 100644 js/student-list.js create mode 100644 js/student.js create mode 100644 package.json create mode 100644 search.html create mode 100644 student-certificates.html create mode 100644 student-list.html create mode 100644 student.html diff --git a/admin.html b/admin.html new file mode 100644 index 0000000..c7da378 --- /dev/null +++ b/admin.html @@ -0,0 +1,19 @@ + + + + Administrator + + + + + + + Student Listing + Issuer Listing + Back + + + + \ No newline at end of file diff --git a/bs-config.json b/bs-config.json new file mode 100644 index 0000000..b71247e --- /dev/null +++ b/bs-config.json @@ -0,0 +1,4 @@ +{ + "port": 80, + "open": false +} \ No newline at end of file diff --git a/certificate.html b/certificate.html new file mode 100644 index 0000000..b5c5b71 --- /dev/null +++ b/certificate.html @@ -0,0 +1,38 @@ + + + + Create Certificate + + + + + + +
+ +
+ +
+
+ +
+
+ +
+
+ +
+ + + Back +
+ + + + + \ No newline at end of file diff --git a/contracts/Master.sol b/contracts/Master.sol new file mode 100644 index 0000000..7fa9f6f --- /dev/null +++ b/contracts/Master.sol @@ -0,0 +1,238 @@ +pragma solidity ^0.4.23; + +contract Master { + + struct Certificate { + address student; + address issuer; + string courseTitle; + string completionDate; + string expiryDate; + } + + struct Student { + string name; + } + + struct Issuer { + string issuerName; + string logoUrl; + string issuerAddress; + } + + mapping (address => Student) private students; + address[] private studentAddresses; + + mapping (address => Issuer) private issuers; + address[] private issuerAddresses; + + Certificate[] private certificates; + + address private adminOwner; + + constructor() public { + adminOwner = msg.sender; + } + + // create new student (admin) + function createStudent(address _address, string _name) public { + + // Check current user is admin + require(adminOwner == msg.sender); + + // Check if account already exists + validateAddress(_address); + + // Add a new student contract to students map + students[_address] = Student({ + name: _name + }); + + // Add the address to studentAddresses array + studentAddresses.push(_address); + } + + function listStudentAddresses() public view returns (address[]) { + + return studentAddresses; + } + + function listIssuerAddresses() public view returns (address[]) { + + return issuerAddresses; + } + + function getStudentName(address _address) public view returns (string) { + + for (uint count = 0; count < studentAddresses.length; count++) { + if (studentAddresses[count] == _address) { + return students[_address].name; + } + } + + revert(); + } + + function getIssuerName(address _address) public view returns (string) { + + for (uint count = 0; count < issuerAddresses.length; count++) { + if (issuerAddresses[count] == _address) { + return issuers[_address].issuerName; + } + } + + revert(); + } + + function getIssuerDetails(address _address) public view returns (string, string, string) { + + for (uint count = 0; count < issuerAddresses.length; count++) { + if (issuerAddresses[count] == _address) { + Issuer storage issuer = issuers[_address]; + return (issuer.issuerName, issuer.logoUrl, issuer.issuerAddress); + } + } + + revert(); + } + + // create new issuer (admin) + function createIssuer(address _address, string _name, string _issuerAddress, string _logoUrl) public { + + // Check current user is admin + require(adminOwner == msg.sender); + + // Check if account already exists + validateAddress(_address); + + // Add a new issuer contract to issuers map + issuers[_address] = Issuer({ + issuerName: _name, + issuerAddress: _issuerAddress, + logoUrl: _logoUrl + }); + + // Add the address to issuerAddresses array + issuerAddresses.push(_address); + } + + function validateAddress(address _address) view private { + + // Check if account already exists + for (uint count = 0; count < studentAddresses.length; count++) { + if (studentAddresses[count] == _address) { + revert(); + } + } + + for (count = 0; count < issuerAddresses.length; count++) { + if (issuerAddresses[count] == _address) { + revert(); + } + } + + if (_address == adminOwner) { + revert(); + } + } + + // create new certificate (issuer) + function createCertificate(address student, string courseTitle, string completionDate, string expiryDate) public { + + for (uint studentCount = 0; studentCount < studentAddresses.length; studentCount++) { + if (studentAddresses[studentCount] == student) { + for (uint issuerCount = 0; issuerCount < issuerAddresses.length; issuerCount++) { + if (issuerAddresses[issuerCount] == msg.sender) { + certificates.push(Certificate({ + student: student, + issuer: msg.sender, + courseTitle: courseTitle, + completionDate: completionDate, + expiryDate: expiryDate + })); + return; + } + } + } + } + + revert(); + } + + // Verify a certificate + function verifyCertificate(address student, address issuer, string courseTitle) public view returns (uint) { + + for (uint count = 0; count < certificates.length; count++) { + Certificate storage certificate = certificates[count]; + if (certificate.student == student && certificate.issuer == issuer && equal(certificate.courseTitle, courseTitle)) { + return count + 1; + } + } + + // validate expiry date + + return 0; + } + + // Student to query his/her own certificates + function getStudentCertificates() public view returns (uint[]) { + + uint[] memory studentCertificates = new uint[](certificates.length); + uint index = 0; + for (uint count = 0; count < certificates.length; count++) { + if (certificates[count].student == msg.sender) { + studentCertificates[index++] = count; + } + } + return studentCertificates; + } + + // Issuer to query issued certificates + function getIssuerCertificates() public view returns (uint[]) { + + uint[] memory issuedCertificates = new uint[](certificates.length); + uint index = 0; + for (uint count = 0; count < certificates.length; count++) { + if (certificates[count].issuer == msg.sender) { + issuedCertificates[index++] = count; + } + } + return issuedCertificates; + } + + function getCertificateDetails(uint index) public view returns (string, string, string, string, string) { + + require(index < certificates.length); + Certificate storage certificate = certificates[index]; + return (issuers[certificate.issuer].issuerName, students[certificate.student].name, certificate.courseTitle, certificate.completionDate, certificate.expiryDate); + } + + function compare(string _a, string _b) private pure returns (int) { + + bytes memory a = bytes(_a); + bytes memory b = bytes(_b); + uint minLength = a.length; + if (b.length < minLength) minLength = b.length; + for (uint i = 0; i < minLength; i ++) + if (a[i] < b[i]) + return -1; + else if (a[i] > b[i]) + return 1; + if (a.length < b.length) + return -1; + else if (a.length > b.length) + return 1; + else + return 0; + } + + function equal(string _a, string _b) private pure returns (bool) { + + return compare(_a, _b) == 0; + } + + // edit new student (admin / student) + // edit new issuer (admin / issuer) + // revoke new certificate (issuer) + +} \ No newline at end of file diff --git a/deploy-contract.js b/deploy-contract.js new file mode 100644 index 0000000..c47dfb9 --- /dev/null +++ b/deploy-contract.js @@ -0,0 +1,33 @@ +console.log('Deploy started on ' + new Date()); +console.log('Loading libraries'); + +var fs = require('fs'); +var Web3 = require('web3'); +var solc = require('solc'); +var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545")); + +console.log('Compiling Solidity contracts'); + +var compiled = solc.compile(fs.readFileSync('contracts/Master.sol').toString()); +var abiDefinition = compiled.contracts[':Master'].interface; +console.log('ABI Definition: ' + abiDefinition); + +var byteCode = compiled.contracts[':Master'].bytecode; +var estimatedGas = web3.eth.estimateGas({data: byteCode}); +console.log('Deploying contracts using estimated gas ' + estimatedGas); + +var contract = web3.eth.contract(JSON.parse(abiDefinition)).new(null, {data: byteCode, from: web3.eth.accounts[0], gas: estimatedGas}); + +new Promise((resolve) => setTimeout(resolve, 1000)).then(() => { + + console.log('Contract address: ' + contract.address); + console.log('Writing dummy data'); + console.log('Creating issuer'); + contract.createIssuer(web3.eth.accounts[1], 'HKU', 'Pokfulam Road, HK', 'http://avuou.hku.hk/guestpage/HKUbw2.gif', {from: web3.eth.accounts[0], gas: contract.createIssuer.estimateGas(web3.eth.accounts[1], 'HKU', 'Pokfulam Road, HK', 'http://avuou.hku.hk/guestpage/HKUbw2.gif')}); + console.log('Creating student'); + contract.createStudent(web3.eth.accounts[2], 'Simon Chan', {from: web3.eth.accounts[0], gas: contract.createStudent.estimateGas(web3.eth.accounts[2], 'Simon Chan')}); + console.log('Creating certificate'); + web3.eth.defaultAccount = web3.eth.accounts[1]; + contract.createCertificate(web3.eth.accounts[2], 'Introduction to Blockchain', '2018-07-01', '2028-08-31', {from: web3.eth.accounts[1], gas: contract.createCertificate.estimateGas(web3.eth.accounts[2], 'Introduction to Blockchain', '2018-07-01', '2028-08-31')}); + console.log('Deploy complete at ' + new Date()); +}); \ No newline at end of file diff --git a/images/cert-template.gif b/images/cert-template.gif new file mode 100644 index 0000000000000000000000000000000000000000..daf2eb3712a0f3526481186c73c7182034e146ef GIT binary patch literal 104587 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 aefjOz-+uuPSm1#P2rk&*gAs-{AOJf$KMQdH literal 0 HcmV?d00001 diff --git a/images/certificate.ico b/images/certificate.ico new file mode 100644 index 0000000000000000000000000000000000000000..fee78c33d55c987d2a745b71dbcba7476d3ca221 GIT binary patch literal 8481 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 literal 0 HcmV?d00001 diff --git a/index.html b/index.html new file mode 100644 index 0000000..168a76c --- /dev/null +++ b/index.html @@ -0,0 +1,20 @@ + + + + Certificate Blockchain Apps + + + + + + + Verify Certificate + I am a student + I am an issuer + I am the administrator + + + + \ No newline at end of file diff --git a/issuer-certificates.html b/issuer-certificates.html new file mode 100644 index 0000000..084efb7 --- /dev/null +++ b/issuer-certificates.html @@ -0,0 +1,57 @@ + + + + Issued Certificates + + + + + + + + + + +
+ + + + + + + + + + + + +
+ Create Certificate + Back + + + \ No newline at end of file diff --git a/issuer-list.html b/issuer-list.html new file mode 100644 index 0000000..bccc78b --- /dev/null +++ b/issuer-list.html @@ -0,0 +1,33 @@ + + + + Issuer Listing + + + + + + +
+ + + + + + + + + + + + +
+ Create Issuer + Back + + + + + \ No newline at end of file diff --git a/issuer.html b/issuer.html new file mode 100644 index 0000000..1f1f6a3 --- /dev/null +++ b/issuer.html @@ -0,0 +1,38 @@ + + + + Create Issuer + + + + + + +
+ +
+ +
+
+ +
+
+ +
+
+ +
+ + + Cancel +
+ + + + + \ No newline at end of file diff --git a/js/certificate.js b/js/certificate.js new file mode 100644 index 0000000..3341282 --- /dev/null +++ b/js/certificate.js @@ -0,0 +1,52 @@ +$(document).ready(function() { + + var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545")); + + if (web3.isConnected()) { + + console.log('Web3 successfully connected'); + var issuerAccount = web3.eth.accounts[1]; + var abiDefinition = [{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"getIssuerName","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"getStudentName","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getIssuerCertificates","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"listStudentAddresses","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"getIssuerDetails","outputs":[{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"student","type":"address"},{"name":"courseTitle","type":"string"},{"name":"completionDate","type":"string"},{"name":"expiryDate","type":"string"}],"name":"createCertificate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"index","type":"uint256"}],"name":"getCertificateDetails","outputs":[{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"},{"name":"_name","type":"string"},{"name":"_issuerAddress","type":"string"},{"name":"_logoUrl","type":"string"}],"name":"createIssuer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"},{"name":"_name","type":"string"}],"name":"createStudent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"listIssuerAddresses","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getStudentCertificates","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"student","type":"address"},{"name":"issuer","type":"address"},{"name":"courseTitle","type":"string"}],"name":"verifyCertificate","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"}]; + var contractAddress = '0x64ec4b719fa6b1fb835b7212e1973236be746989'; + var masterContract = web3.eth.contract(abiDefinition); + var contractInstance = masterContract.at(contractAddress); + web3.eth.defaultAccount = issuerAccount; + + try { + var issuerName = contractInstance.getIssuerName(issuerAccount); + $('h1').html('Create Certificate - ' + issuerName); + } catch (e) { + console.log(e); + $('.alert-danger').html('Issuer not found.').show(); + } + + $('form').submit(function (event) { + $('.alert-danger, .alert-success').hide(); + var courseTitle = $("#course-title").val(); + var completionDate = $("#completion-date").val(); + var expiryDate = $("#expiry-date").val(); + var address = $("#address").val(); + var index = web3.eth.accounts.indexOf(address); + + if (index < 0) { + $('.alert-danger').html('Account address not found.').show(); + console.log('Valid addresses', web3.eth.accounts); + } else { + try { + var estimatedGas = contractInstance.createCertificate.estimateGas(address, courseTitle, completionDate, expiryDate); + contractInstance.createCertificate(address, courseTitle, completionDate, expiryDate, {from: issuerAccount, gas: estimatedGas}); + $('.alert-success').show(); + $('#course-title, #completion-date, #expiry-date, #address').val(''); + } catch (e) { + console.log(e); + $('.alert-danger').html('Error occurred.').show(); + } + } + + event.preventDefault(); + }); + } else { + $('form').prepend('
Blockchain not connected
'); + $(':submit').prop('disabled', true); + } +}); \ No newline at end of file diff --git a/js/issuer-certificates.js b/js/issuer-certificates.js new file mode 100644 index 0000000..f9a88be --- /dev/null +++ b/js/issuer-certificates.js @@ -0,0 +1,50 @@ +$(document).ready(function() { + + var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545")); + + if (web3.isConnected()) { + + console.log('Web3 successfully connected'); + var issuerAccount = web3.eth.accounts[1]; + var abiDefinition = [{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"getIssuerName","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"getStudentName","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getIssuerCertificates","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"listStudentAddresses","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"getIssuerDetails","outputs":[{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"student","type":"address"},{"name":"courseTitle","type":"string"},{"name":"completionDate","type":"string"},{"name":"expiryDate","type":"string"}],"name":"createCertificate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"index","type":"uint256"}],"name":"getCertificateDetails","outputs":[{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"},{"name":"_name","type":"string"},{"name":"_issuerAddress","type":"string"},{"name":"_logoUrl","type":"string"}],"name":"createIssuer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"},{"name":"_name","type":"string"}],"name":"createStudent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"listIssuerAddresses","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getStudentCertificates","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"student","type":"address"},{"name":"issuer","type":"address"},{"name":"courseTitle","type":"string"}],"name":"verifyCertificate","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"}]; + var contractAddress = '0x64ec4b719fa6b1fb835b7212e1973236be746989'; + var masterContract = web3.eth.contract(abiDefinition); + var contractInstance = masterContract.at(contractAddress); + web3.eth.defaultAccount = issuerAccount; + + try { + var issuerName = contractInstance.getIssuerName(issuerAccount); + $('h1').html('Issued Certificates - ' + issuerName); + $('#issuer-name').text(issuerName); + } catch (e) { + console.log(e); + $('table').replaceWith('
Issuer not found
'); + } + + var certificates = contractInstance.getIssuerCertificates(); + console.log(certificates.length + " certificate record(s) loaded"); + + if (certificates.length > 0) { + certificates.forEach(function (index) { + var certificateDetails = contractInstance.getCertificateDetails(index); + var expiry = certificateDetails[4] ? certificateDetails[4] : "N/A"; + var student = '' + certificateDetails[1] + ''; + $('table tbody').append('' + student + '' + certificateDetails[2] + '' + certificateDetails[3] + '' + expiry + ''); + $('table').show(); + }); + } else { + $('table').replaceWith('
No issued certificates
'); + } + $('table').on('click', '.cert-button', function () { + var student = $(this).text(); + var courseTitle = $(this).parent().next(); + var completionDate = courseTitle.next(); + $('#student-name').text(student); + $('#course-title').text(courseTitle.text()); + $('#completion-date').text(completionDate.text()); + }); + } else { + $('table').replaceWith('
Blockchain not connected
'); + } + +}); \ No newline at end of file diff --git a/js/issuer-list.js b/js/issuer-list.js new file mode 100644 index 0000000..2483f92 --- /dev/null +++ b/js/issuer-list.js @@ -0,0 +1,29 @@ +$(document).ready(function() { + + var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545")); + + if (web3.isConnected()) { + + console.log('Web3 successfully connected'); + var abiDefinition = [{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"getIssuerName","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"getStudentName","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getIssuerCertificates","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"listStudentAddresses","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"getIssuerDetails","outputs":[{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"student","type":"address"},{"name":"courseTitle","type":"string"},{"name":"completionDate","type":"string"},{"name":"expiryDate","type":"string"}],"name":"createCertificate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"index","type":"uint256"}],"name":"getCertificateDetails","outputs":[{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"},{"name":"_name","type":"string"},{"name":"_issuerAddress","type":"string"},{"name":"_logoUrl","type":"string"}],"name":"createIssuer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"},{"name":"_name","type":"string"}],"name":"createStudent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"listIssuerAddresses","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getStudentCertificates","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"student","type":"address"},{"name":"issuer","type":"address"},{"name":"courseTitle","type":"string"}],"name":"verifyCertificate","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"}]; + var contractAddress = '0x64ec4b719fa6b1fb835b7212e1973236be746989'; + var masterContract = web3.eth.contract(abiDefinition); + var contractInstance = masterContract.at(contractAddress); + var issuerAddresses = contractInstance.listIssuerAddresses(); + console.log(issuerAddresses.length + ' issuer record(s) loaded'); + + if (issuerAddresses.length > 0) { + issuerAddresses.forEach(function (address) { + var issuerDetails = contractInstance.getIssuerDetails(address); + var businessAddress = issuerDetails[2] ? issuerDetails[2] : '-'; + var imageHtml = issuerDetails[1] ? '' : '-'; + $('table tbody').append('' + issuerDetails[0] + '' + address + '' + businessAddress + '' + imageHtml + ''); + $('table').show(); + }); + } else { + $('table').replaceWith('
No issuer accounts in the system
'); + } + } else { + $('table').replaceWith('
Blockchain not connected
'); + } +}); \ No newline at end of file diff --git a/js/issuer.js b/js/issuer.js new file mode 100644 index 0000000..3ae9e3c --- /dev/null +++ b/js/issuer.js @@ -0,0 +1,45 @@ +$(document).ready(function() { + + var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545")); + + if (web3.isConnected()) { + + console.log('Web3 successfully connected'); + var account = web3.eth.accounts[0]; + web3.personal.unlockAccount(account); + + var abiDefinition = [{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"getIssuerName","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"getStudentName","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getIssuerCertificates","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"listStudentAddresses","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"getIssuerDetails","outputs":[{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"student","type":"address"},{"name":"courseTitle","type":"string"},{"name":"completionDate","type":"string"},{"name":"expiryDate","type":"string"}],"name":"createCertificate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"index","type":"uint256"}],"name":"getCertificateDetails","outputs":[{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"},{"name":"_name","type":"string"},{"name":"_issuerAddress","type":"string"},{"name":"_logoUrl","type":"string"}],"name":"createIssuer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"},{"name":"_name","type":"string"}],"name":"createStudent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"listIssuerAddresses","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getStudentCertificates","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"student","type":"address"},{"name":"issuer","type":"address"},{"name":"courseTitle","type":"string"}],"name":"verifyCertificate","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"}]; + var contractAddress = '0x64ec4b719fa6b1fb835b7212e1973236be746989'; + var masterContract = web3.eth.contract(abiDefinition); + var contractInstance = masterContract.at(contractAddress); + + $('form').submit(function (event) { + $('.alert-danger, .alert-success').hide(); + var address = $("#address").val(); + var issuerName = $("#issuer-name").val(); + var issuerAddress = $("#issuer-address").val(); + var url = $("#logo-url").val(); + var index = web3.eth.accounts.indexOf(address); + + if (index < 0) { + $('.alert-danger').html('Account address not found.').show(); + console.log('Valid addresses', web3.eth.accounts); + } else { + try { + var estimatedGas = contractInstance.createIssuer.estimateGas(address, issuerName, issuerAddress, url); + contractInstance.createIssuer(address, issuerName, issuerAddress, url, {from: account, gas: estimatedGas}); + $('.alert-success').show(); + $('#address, #issuer-name, #issuer-address, #logo-url').val(''); + } catch (e) { + console.log(e); + $('.alert-danger').html('Error occurred.').show(); + } + } + + event.preventDefault(); + }); + } else { + $('form').prepend('
Blockchain not connected
'); + $(':submit').prop('disabled', true); + } +}); \ No newline at end of file diff --git a/js/search.js b/js/search.js new file mode 100644 index 0000000..da91789 --- /dev/null +++ b/js/search.js @@ -0,0 +1,47 @@ +$(document).ready(function() { + + var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545")); + + if (web3.isConnected()) { + + console.log('Web3 successfully connected'); + var abiDefinition = [{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"getIssuerName","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"getStudentName","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getIssuerCertificates","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"listStudentAddresses","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"getIssuerDetails","outputs":[{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"student","type":"address"},{"name":"courseTitle","type":"string"},{"name":"completionDate","type":"string"},{"name":"expiryDate","type":"string"}],"name":"createCertificate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"index","type":"uint256"}],"name":"getCertificateDetails","outputs":[{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"},{"name":"_name","type":"string"},{"name":"_issuerAddress","type":"string"},{"name":"_logoUrl","type":"string"}],"name":"createIssuer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"},{"name":"_name","type":"string"}],"name":"createStudent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"listIssuerAddresses","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getStudentCertificates","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"student","type":"address"},{"name":"issuer","type":"address"},{"name":"courseTitle","type":"string"}],"name":"verifyCertificate","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"}]; + var contractAddress = '0x64ec4b719fa6b1fb835b7212e1973236be746989'; + var masterContract = web3.eth.contract(abiDefinition); + var contractInstance = masterContract.at(contractAddress); + + $('form').submit(function (event) { + + $('.alert-warning, .alert-success').hide(); + var student = $("#student").val(); + var issuer = $("#issuer").val(); + var title = $("#title").val(); + var studentIndex = web3.eth.accounts.indexOf(student); + var issuerIndex = web3.eth.accounts.indexOf(issuer); + + if (studentIndex < 0 || issuerIndex < 0) { + $('.alert-danger').html('Account address not found.').show(); + console.log('Valid addresses', web3.eth.accounts); + } else { + // Search the certificate + var index = contractInstance.verifyCertificate(student, issuer, title); + if (index > 0) { + $('.alert-success').show(); + $("#student, #issuer, #title").val(''); + var certificateDetails = contractInstance.getCertificateDetails(index - 1); + $('#issuer-name').text(certificateDetails[0]); + $('#student-name').text(certificateDetails[1]); + $('#course-title').text(certificateDetails[2]); + $('#completion-date').text(certificateDetails[3]); + } else { + $('.alert-warning').show(); + } + } + + event.preventDefault(); + }); + } else { + $('form').prepend('
Blockchain not connected
'); + $(':submit').prop('disabled', true); + } +}); \ No newline at end of file diff --git a/js/student-certificates.js b/js/student-certificates.js new file mode 100644 index 0000000..5795896 --- /dev/null +++ b/js/student-certificates.js @@ -0,0 +1,49 @@ +$(document).ready(function() { + + var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545")); + + if (web3.isConnected()) { + + console.log('Web3 successfully connected'); + var studentAccount = web3.eth.accounts[2]; + var abiDefinition = [{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"getIssuerName","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"getStudentName","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getIssuerCertificates","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"listStudentAddresses","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"getIssuerDetails","outputs":[{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"student","type":"address"},{"name":"courseTitle","type":"string"},{"name":"completionDate","type":"string"},{"name":"expiryDate","type":"string"}],"name":"createCertificate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"index","type":"uint256"}],"name":"getCertificateDetails","outputs":[{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"},{"name":"_name","type":"string"},{"name":"_issuerAddress","type":"string"},{"name":"_logoUrl","type":"string"}],"name":"createIssuer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"},{"name":"_name","type":"string"}],"name":"createStudent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"listIssuerAddresses","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getStudentCertificates","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"student","type":"address"},{"name":"issuer","type":"address"},{"name":"courseTitle","type":"string"}],"name":"verifyCertificate","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"}]; + var contractAddress = '0x64ec4b719fa6b1fb835b7212e1973236be746989'; + var masterContract = web3.eth.contract(abiDefinition); + var contractInstance = masterContract.at(contractAddress); + web3.eth.defaultAccount = studentAccount; + + try { + var studentName = contractInstance.getStudentName(studentAccount); + $('h1').html('My Certificates - ' + studentName); + $('#student-name').text(studentName); + } catch (e) { + console.log(e); + $('table').replaceWith('
Student not found
'); + } + + var certificates = contractInstance.getStudentCertificates(); + console.log(certificates.length + " certificate record(s) loaded"); + + if (certificates.length > 0) { + certificates.forEach(function (index) { + var certificateDetails = contractInstance.getCertificateDetails(index); + var expiry = certificateDetails[4] ? certificateDetails[4] : "N/A"; + var issuer = '' + certificateDetails[0] + ''; + $('table tbody').append('' + issuer + '' + certificateDetails[2] + '' + certificateDetails[3] + '' + expiry + ''); + $('table').show(); + }); + } else { + $('table').replaceWith('
You have no certificates.
'); + } + $('table').on('click', '.cert-button', function () { + var issuer = $(this).text(); + var courseTitle = $(this).parent().next(); + var completionDate = courseTitle.next(); + $('#issuer-name').text(issuer); + $('#course-title').text(courseTitle.text()); + $('#completion-date').text(completionDate.text()); + }); + } else { + $('table').replaceWith('
Blockchain not connected
'); + } +}); \ No newline at end of file diff --git a/js/student-list.js b/js/student-list.js new file mode 100644 index 0000000..99cf021 --- /dev/null +++ b/js/student-list.js @@ -0,0 +1,30 @@ +$(document).ready(function() { + + var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545")); + + if (web3.isConnected()) { + + console.log('Web3 successfully connected'); + var abiDefinition = [{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"getIssuerName","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"getStudentName","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getIssuerCertificates","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"listStudentAddresses","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"getIssuerDetails","outputs":[{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"student","type":"address"},{"name":"courseTitle","type":"string"},{"name":"completionDate","type":"string"},{"name":"expiryDate","type":"string"}],"name":"createCertificate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"index","type":"uint256"}],"name":"getCertificateDetails","outputs":[{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"},{"name":"_name","type":"string"},{"name":"_issuerAddress","type":"string"},{"name":"_logoUrl","type":"string"}],"name":"createIssuer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"},{"name":"_name","type":"string"}],"name":"createStudent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"listIssuerAddresses","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getStudentCertificates","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"student","type":"address"},{"name":"issuer","type":"address"},{"name":"courseTitle","type":"string"}],"name":"verifyCertificate","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"}]; + var contractAddress = '0x64ec4b719fa6b1fb835b7212e1973236be746989'; + var masterContract = web3.eth.contract(abiDefinition); + var contractInstance = masterContract.at(contractAddress); + var studentAddresses = contractInstance.listStudentAddresses(); + console.log(studentAddresses.length + ' student record(s) loaded'); + + if (studentAddresses.length > 0) { + studentAddresses.forEach(function (address) { + // Query the student name from blockchain + var studentName = contractInstance.getStudentName(address); + + // Append a new HTML table row + $('table tbody').append('' + studentName + '' + address + ''); + $('table').show(); + }); + } else { + $('table').replaceWith('
No student accounts in the system
'); + } + } else { + $('table').replaceWith('
Blockchain not connected
'); + } +}); \ No newline at end of file diff --git a/js/student.js b/js/student.js new file mode 100644 index 0000000..a187308 --- /dev/null +++ b/js/student.js @@ -0,0 +1,43 @@ +$(document).ready(function() { + + var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545")); + + if (web3.isConnected()) { + + console.log('Web3 successfully connected'); + var account = web3.eth.accounts[0]; + web3.personal.unlockAccount(account); + + var abiDefinition = [{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"getIssuerName","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"getStudentName","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getIssuerCertificates","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"listStudentAddresses","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"getIssuerDetails","outputs":[{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"student","type":"address"},{"name":"courseTitle","type":"string"},{"name":"completionDate","type":"string"},{"name":"expiryDate","type":"string"}],"name":"createCertificate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"index","type":"uint256"}],"name":"getCertificateDetails","outputs":[{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"},{"name":"_name","type":"string"},{"name":"_issuerAddress","type":"string"},{"name":"_logoUrl","type":"string"}],"name":"createIssuer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"},{"name":"_name","type":"string"}],"name":"createStudent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"listIssuerAddresses","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getStudentCertificates","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"student","type":"address"},{"name":"issuer","type":"address"},{"name":"courseTitle","type":"string"}],"name":"verifyCertificate","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"}]; + var contractAddress = '0x64ec4b719fa6b1fb835b7212e1973236be746989'; + var masterContract = web3.eth.contract(abiDefinition); + var contractInstance = masterContract.at(contractAddress); + + $('form').submit(function (event) { + $('.alert-danger, .alert-success').hide(); + var address = $("#address").val(); + var fullName = $("#full-name").val(); + var index = web3.eth.accounts.indexOf(address); + + if (index < 0) { + $('.alert-danger').html('Account address not found.').show(); + console.log('Valid addresses', web3.eth.accounts); + } else { + try { + var estimatedGas = contractInstance.createStudent.estimateGas(address, fullName); + contractInstance.createStudent(address, fullName, {from: account, gas: estimatedGas}); + $('.alert-success').show(); + $('#address, #full-name').val(''); + } catch (e) { + console.log(e); + $('.alert-danger').html('Error occurred.').show(); + } + } + + event.preventDefault(); + }); + } else { + $('form').prepend('
Blockchain not connected
'); + $(':submit').prop('disabled', true); + } +}); \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..56a68be --- /dev/null +++ b/package.json @@ -0,0 +1,19 @@ +{ + "name": "certificate-blockchain", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "dev": "lite-server" + }, + "author": "", + "license": "ISC", + "devDependencies": { + "lite-server": "^2.3.0" + }, + "dependencies": { + "ganache-cli": "^6.1.3", + "solc": "^0.4.24", + "web3": "^0.20.2" + } +} diff --git a/search.html b/search.html new file mode 100644 index 0000000..8035656 --- /dev/null +++ b/search.html @@ -0,0 +1,56 @@ + + + + Verify Certificate + + + + + + + + + + +
+ +
+ +
+
+ +
+
+ +
+ + + Back +
+ + + \ No newline at end of file diff --git a/student-certificates.html b/student-certificates.html new file mode 100644 index 0000000..beef27f --- /dev/null +++ b/student-certificates.html @@ -0,0 +1,56 @@ + + + + My Certificates + + + + + + + + + + +
+ + + + + + + + + + + + +
+ Back + + + \ No newline at end of file diff --git a/student-list.html b/student-list.html new file mode 100644 index 0000000..cafc001 --- /dev/null +++ b/student-list.html @@ -0,0 +1,31 @@ + + + + Student Listing + + + + + + +
+ + + + + + + + + + +
+ Create Student + Back + + + + + \ No newline at end of file diff --git a/student.html b/student.html new file mode 100644 index 0000000..858375f --- /dev/null +++ b/student.html @@ -0,0 +1,32 @@ + + + + Create Student + + + + + + +
+ +
+ +
+
+ +
+ + + Cancel +
+ + + + + \ No newline at end of file