|
| 1 | +## Table Of Contents |
| 2 | + |
| 3 | +- [Description](#Vue-Expenses) |
| 4 | + - [Demo](#demo) |
| 5 | +- [Tech Stack](#Tech-Stack) |
| 6 | + - [Server Side](#Server-Side) |
| 7 | + - [Client Side](#Client-Side) |
| 8 | +- [Screenshots](#Screenshots) |
| 9 | +- [Local Building](#Local-Building) |
| 10 | +- [Config](#Config) |
| 11 | +- [Future Enhancements](#Future-Enhancements) |
| 12 | +- [How to Contribute](#How-to-Contribute) |
| 13 | +- [License](#License) |
| 14 | + |
| 15 | +# Vue Expenses |
| 16 | + |
| 17 | +A simple expenses tracking application built with VueJs and .NET Core |
| 18 | + |
| 19 | +### Demo |
| 20 | + |
| 21 | +[Vue Expenses](https://vue-expense.herokuapp.com) |
| 22 | + |
| 23 | +- Password: `test` |
| 24 | + |
| 25 | +Please note that you can change the theme in the setting page and the data on the demo website will be reset at regular intervals |
| 26 | + |
| 27 | +# Tech Stack |
| 28 | + |
| 29 | +### Server Side |
| 30 | + |
| 31 | +- [.NET Core 3.0](https://github.com/dotnet/core) for server side API |
| 32 | +- [Fluent Validation](https://github.com/JeremySkinner/FluentValidation) |
| 33 | +- CQRS |
| 34 | + - [MediatR](https://github.com/jbogard/MediatR) |
| 35 | + - [Entity Framework Core](https://github.com/aspnet/EntityFrameworkCore) on SQLite. |
| 36 | + - [Dapper](https://github.com/StackExchange/Dapper) for querying |
| 37 | +- [Swashbuckle.AspNetCore](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) for Swagger |
| 38 | +- [ASP.NET Core JWT Bearer Authentication](https://github.com/aspnet/Security) for [JWT](https://jwt.io/) authentication with support for [refresh tokens](https://tools.ietf.org/html/rfc6749#section-1.5). |
| 39 | +- [Serilog](https://github.com/serilog/serilog) for logging |
| 40 | +- Reference architecture [ContosoUniversity](https://github.com/jbogard/ContosoUniversityDotNetCore) |
| 41 | +- Feature folders and vertical slices |
| 42 | + |
| 43 | +### Client Side |
| 44 | + |
| 45 | +- [VueJs](https://github.com/vuejs/vue) for client application |
| 46 | +- [Vuex](https://github.com/vuejs/vuex) for state management |
| 47 | +- [Vue-router](https://github.com/vuejs/vue-router) for client routing |
| 48 | +- [Axios](https://github.com/axios/axios) for HTTP requests |
| 49 | +- [Vuetify](https://github.com/vuetifyjs/vuetify) as component framework |
| 50 | +- [Lodash](https://github.com/lodash/lodash) for client side utility |
| 51 | +- [Vue-echarts](https://github.com/ecomfe/vue-echarts) for [Echarts](https://echarts.apache.org/en/index.html) |
| 52 | + |
| 53 | +# Screenshots |
| 54 | + |
| 55 | +### Dashboard |
| 56 | + |
| 57 | +<img src="/assets/images/Dashboard.png" alt="Vue Expenses Dashnoard" width="100%" /> |
| 58 | + |
| 59 | +### Expense Listing |
| 60 | + |
| 61 | +<img src="/assets/images/Expenses.png" alt="Vue Expenses Listing" width="100%" /> |
| 62 | + |
| 63 | +### Stats |
| 64 | + |
| 65 | +<img src="/assets/images/Stats.png" alt="Vue Expenses Stats" width="100%" /> |
| 66 | + |
| 67 | +### Settings |
| 68 | + |
| 69 | +<img src="/assets/images/Settings.png" alt="Vue Expenses Settings" width="100%" /> |
| 70 | + |
| 71 | +### Profile |
| 72 | + |
| 73 | +<img src="/assets/images/Profile.png" alt="Vue Expenses Profile" width="100%" /> |
| 74 | + |
| 75 | +### Mobile View |
| 76 | +- [Dashboard](/assets/images/mobile/dashboard.png) |
| 77 | +- [Stats](/assets/images/mobile/Stats.png) |
| 78 | + |
| 79 | +# Local Building |
| 80 | + |
| 81 | +### Server |
| 82 | + |
| 83 | +- Install [.NET Core SDK](https://dotnet.microsoft.com/download) |
| 84 | +- Go to vue-expenses-api folder and run `dotnet restore` and `dotnet build` |
| 85 | +- Run `dotnet run` to start the server at `http://localhost:5000/` |
| 86 | +- You can view the API reference at `http://localhost:5000/swagger` |
| 87 | +- Included database is seeded with dummy data and you can you the same credentials as the demo site to login |
| 88 | + |
| 89 | +### Client |
| 90 | + |
| 91 | +- Go to vue-expenses-client folder and run `npm install` |
| 92 | +- Run `npm run serve` to start the client at `http://localhost:8080/` |
| 93 | +- The application is seeded with dummy data and you can use `email: [email protected]` and `password: test` to login |
| 94 | + |
| 95 | +# Config |
| 96 | + |
| 97 | +### Server |
| 98 | + |
| 99 | +#### ConnectionStrings |
| 100 | + |
| 101 | +- `DefaultConnection`: `Data Source=App_Data/expenses.db` |
| 102 | + - Where the sqlite db file is located, this can be changed in `appsettings.json` file |
| 103 | + |
| 104 | +#### JwtSettings |
| 105 | + |
| 106 | +- `SecurityKey`: `A super secret long key to encrypt and decrypt the token` |
| 107 | +- `Issuer`: `Issuer` |
| 108 | +- `Audience`: `Audience` |
| 109 | + - The key, issuer and audience values to generate a jwt token, this can be changed in `appsettings.json` file |
| 110 | + |
| 111 | +#### PasswordHasher |
| 112 | + |
| 113 | +- `Key`: `Secret key to encrypt passwords` |
| 114 | + - The key to encrypt the passwords, this can be changed in `appsettings.json` file |
| 115 | + |
| 116 | +### Client |
| 117 | + |
| 118 | +- `VUE_APP_BASE_URL`: `http://localhost:5000/` |
| 119 | + - Base url to connect to the API, this can be changed in the `.env` file |
| 120 | + |
| 121 | +- `productionSourceMap`: `false` |
| 122 | + - Generates source map file when building for production, this can be changed in `vue.config.js` file |
| 123 | + |
| 124 | +- `outputDir`: comment out by default |
| 125 | + - Where the built files will be copied over, this can be changed in `vue.config.js` file |
| 126 | + |
| 127 | +- `assetsDir`: comment out by default |
| 128 | + - Where the built minified css/js files will be copied over, this path is relative path from the `outputDir`, this can be changed in `vue.config.js` file |
| 129 | + |
| 130 | +# Future Enhancements |
| 131 | + |
| 132 | +- Have an admin role and an admin section to manage users |
| 133 | +- Add search functionality to expenses page |
| 134 | +- Add server side sorting/paging/searching to expensese page (and fix all actions/getters that rely on expenses being in the store) |
| 135 | + |
| 136 | +# How to Contribute |
| 137 | + |
| 138 | +1. Clone repo `git clone https://github.com/simplyvinay/vue-expenses.git` |
| 139 | +2. Create a new branch: `git checkout -b new_branch_name` |
| 140 | +3. Make changes and test |
| 141 | +4. Submit Pull Request with description of changes |
| 142 | + |
| 143 | +## License |
| 144 | + |
| 145 | +[MIT](https://github.com/simplyvinay/vue-expenses/blob/master/LICENSE) |
0 commit comments