Skip to content

Commit

Permalink
Merge pull request #7 from hoangsonww/deployment-branch
Browse files Browse the repository at this point in the history
Updated Personal Portfolio
  • Loading branch information
hoangsonww authored Sep 1, 2024
2 parents dc900db + 0ffe3c6 commit adaafda
Show file tree
Hide file tree
Showing 17 changed files with 11,358 additions and 16,126 deletions.
29 changes: 18 additions & 11 deletions .github/README.md
Original file line number Diff line number Diff line change
@@ -1,18 +1,21 @@
# Welcome to My Portfolio Website!
# Welcome to My Portfolio Website! 🌟

<p align="center">
<a href="https://sonnguyenhoang.com">
<img src="../utils/portfolioWebsite.png" alt="Website Screenshot" style="border-radius: 8px">
<img src="../utils/portfolioWebsite.png" alt="Portfolio UI" style="border-radius: 8px">
</a>
</p>

🚀 Welcome to the repository of my personal portfolio website! A seamless blend of style and functionality, showcasing my journey, projects, and skills in the tech world. Built with modern web technologies and a touch of creativity to provide an interactive user experience. Live at [https://sonnguyenhoang.com](https://sonnguyenhoang.com). Dive in, explore, and let’s connect!
🚀 Welcome to the repository of my personal portfolio website! A seamless blend of style and functionality, showcasing my journey, projects, and skills in the tech world. Built with modern web technologies and a touch of creativity to provide an interactive user experience. Dive in, explore, and let’s connect!

**Currently live at [sonnguyenhoang.com](https://sonnguyenhoang.com).**

## Features

- **Interactive UI/UX:** A user-friendly interface with interactive elements for an engaging user experience.
- **Responsive Design:** Optimized for a variety of screen sizes and devices, ensuring accessibility and usability.
- **Project Showcase:** A detailed glimpse into my projects, complete with images, descriptions, and live demo links.
- **Personal Chatbot:** A personal chatbot for answering FAQs and providing information about me and my work.
- **Contact Form:** A built-in contact form for easy communication, making staying in touch a breeze.
- **Dark Mode:** A toggleable dark mode for a more comfortable viewing experience in low-light environments.
- **Animations:** Smooth animations and transitions to enhance the user experience and make the website more dynamic.
Expand All @@ -22,12 +25,11 @@
- **Accessibility:** Accessibility features to ensure the website is usable by people with disabilities.
- **Performance:** Optimized for performance to ensure the website loads quickly and efficiently.
- **Security:** Secure HTTPS connection to protect the integrity and confidentiality of the website.
- **Flask Backend:** A Flask backend for handling contact form submissions and chatbot functionality.
- **Version Control:** Version controlled with Git and hosted on GitHub for easy collaboration and deployment.
- **Deployment:** Deployed on GitHub Pages with a custom domain name for easy access and a professional look.
- **Analytics:** Google Analytics integration to track and analyze website traffic and user behavior.
- **Maintenance:** Regularly maintained and updated to ensure the website is up-to-date and running smoothly.
- **Documentation:** Well-documented code for easy understanding and future maintenance.
- **Open-Source:** Open-source and available under the MIT License for easy sharing and collaboration.

## Technologies Used

Expand All @@ -36,16 +38,15 @@
- JavaScript
- jQuery
- Bootstrap
- VanillaJS
- React
- SwiperJS
- HTTP Server
- Webpack
- Flask
- REST APIs
- Git
- GitHub
- GitHub Pages
- Google Analytics
- Google Domains (now on Squarespace)
- Google Domains

## Installation and Usage

Expand All @@ -54,9 +55,15 @@
git clone https://github.com/hoangsonww/My-Portfolio-Website.git
cd My-Portfolio-Website
```

2. **Open with Live Server**
- If you're using VS Code, you can install the Live Server extension and start it to launch the website in your browser.
- Alternatively, simply open the `index.html` file in your browser.
- Also, you can run the following command:
```bash
npm install
npm start
```
## Contributing
Expand All @@ -66,7 +73,7 @@ If you use any ideas or code from this repository, please credit me by linking b

## License

This project is open-source and available under the MIT License.
This project is open-source and available under the MIT License. See the [LICENSE](../LICENSE) file for more information.

## Connect with Me

Expand All @@ -78,4 +85,4 @@ I'm always open to connecting, collaborations, and conversations!
---
Created with ❤️ by [Son Nguyen](https://sonnguyenhoang.com) in 2023. Thanks for visiting!
Created with ❤️ by [Son Nguyen](https://sonnguyenhoang.com) in 2023. Thanks for visiting today! 🚀
2 changes: 1 addition & 1 deletion .idea/My-Portfolio-Website.iml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion .idea/dataSources.local.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 7 additions & 0 deletions .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

19 changes: 14 additions & 5 deletions backend/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,14 @@
# Initialize Flask App
app = Flask(__name__)

# Database Configuration
# Database Configuration (Replace with your own database URI if you want to use my project)
app.config['SECRET_KEY'] = 'your_secret_key'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///portfolio.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
migrate = Migrate(app, db)

# Mail Configuration
# Mail Configuration (Replace with your own mail server details if you want to use my project)
app.config['MAIL_SERVER']='smtp.yourmailserver.com'
app.config['MAIL_PORT'] = 587
app.config['MAIL_USERNAME'] = '[email protected]'
Expand Down Expand Up @@ -46,6 +46,7 @@ def set_password(self, password):
def check_password(self, password):
return check_password_hash(self.password_hash, password)


# Database models
class Contact(db.Model):
id = db.Column(db.Integer, primary_key=True)
Expand All @@ -54,21 +55,25 @@ class Contact(db.Model):
subject = db.Column(db.String(150))
message = db.Column(db.Text)


class Project(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100), nullable=False)
description = db.Column(db.Text)
link = db.Column(db.String(200))


class Skill(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80), nullable=False)
proficiency = db.Column(db.Integer)


@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))


@app.route('/register', methods=['POST'])
def register():
data = request.form
Expand All @@ -78,6 +83,7 @@ def register():
db.session.commit()
return jsonify({"status": "User registered successfully"}), 201


@app.route('/login', methods=['POST'])
def login():
data = request.form
Expand All @@ -87,12 +93,14 @@ def login():
return jsonify({"status": "Logged in successfully"}), 200
return jsonify({"status": "Invalid username or password"}), 401


@app.route('/logout')
@login_required
def logout():
logout_user()
return jsonify({"status": "Logged out successfully"}), 200


# Routes
@app.route('/contact', methods=['POST'])
def contact():
Expand All @@ -102,26 +110,26 @@ def contact():
db.session.commit()
return jsonify({"status": "success"}), 201


@app.route('/projects', methods=['GET'])
def get_projects():
projects = Project.query.all()
project_data = [{"title": project.title, "description": project.description, "link": project.link} for project in projects]
return jsonify(project_data)


@app.route('/skills', methods=['GET'])
def get_skills():
skills = Skill.query.all()
skill_data = [{"name": skill.name, "proficiency": skill.proficiency} for skill in skills]
return jsonify(skill_data)


# Error handling
@app.errorhandler(404)
def not_found(error):
return make_response(jsonify({'error': 'Not found'}), 404)

if __name__ == '__main__':
db.create_all()
app.run(debug=True)

@app.route('/send_mail', methods=['POST'])
def send_mail():
Expand All @@ -131,6 +139,7 @@ def send_mail():
mail.send(msg)
return jsonify({"status": "Email sent successfully"}), 200


if __name__ == '__main__':
db.create_all()
app.run(debug=True)
Loading

0 comments on commit adaafda

Please sign in to comment.