The voting contract should be configurable. Like you can deploy for many time for different times of voting.
In user creation part, You should add the user's public address to the Blockchain in Users map structure, then only you can validate whether the user already voted or not in the blockchain. Otherwise, you will not use blockchain real data. You have to display blockchain data whenever an application connected.
Saving the data in MySQL and only executing code in blockchain will not utilize the ability of blockchain 100%.
Using Web3 logs, you have all the states of the application and update in your database.
Even though you allow users to create a login through the application, their public keys should get created and add to the blockchain.
Whenever you deploy a voting contract the candidates or proposals should pass through the contract creation means proposals should be created through the contract constructor.
So that you can run multiple voting by deploying to different contract address