The tricky part in your scenario will be the notification part. There is no way to send general "notifications" in Ethereum. But here are some options:
1) Issue the request transaction normally and send a notification (email or whatever) with your backend system (so the notification has nothing to do with the blockchain)
2) Send some sort of transaction to the professor's wallet and the professor has some monitoring system which notifies him when there's a new transaction to his wallet. Or a smart contract which does something (emits an event for example ) and the professor monitors the smart contract.
Otherwise it's pretty basic stuff assuming the students and the professor can be identified with their public address. So something like this:
pragma solidity ^0.5.0;
contract Certs {
mapping(address => string) requests;
address professorAddr;
modifier onlyProfessor() {
require(msg.sender == professorAddr);
_;
}
function requestCert(string memory certName) public {
requests[msg.sender] = certName;
}
function approve(address requestAddr) public onlyProfessor {
delete requests[requestAddr];
// issue certificate in some way
}
}