There are a couple ways to 'skin this cat'. You have two pieces you need to maintain:
- Open and closed hours
- Appointments already taken
For the appointment submission and taken, I'd suggest the user contributions webpart as you've already read about.
For the Open/Closed times, you have a few options:
- If you know specifically the hours won't change, just create some logic around those days and hours and hide/show available times
- If you don't know the specific hours, create a custom module for the client to manage when they are open and closed per day. It get's to be a little daunting to do this but it allows the client the full control of their work calendar.