diff --git a/.idea/sandboxMP.iml b/.idea/sandboxMP.iml
index c3ae99e..6b57a36 100644
--- a/.idea/sandboxMP.iml
+++ b/.idea/sandboxMP.iml
@@ -12,7 +12,9 @@
-
+
+
+
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index e5cfb9d..92cf51a 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -2,1180 +2,20 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1184,29 +24,109 @@
+
+
+
-
-
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
@@ -1217,7 +137,7 @@
true
DEFINITION_ORDER
-
+
@@ -1255,6 +175,7 @@
+
@@ -1263,17 +184,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
@@ -1284,6 +220,9 @@
+
+
+
@@ -1344,28 +283,30 @@
-
+
+
-
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
-
+
-
-
+
+
@@ -1380,6 +321,16 @@
+
+
+
+
+
+
+
+
+
+
@@ -1392,7 +343,6 @@
-
@@ -1400,7 +350,6 @@
-
@@ -1424,7 +373,6 @@
-
@@ -1432,24 +380,67 @@
+
+
+
+
+
+
+
-
+
-
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/__init__.py b/apps/__init__.py
new file mode 100644
index 0000000..8ed94fc
--- /dev/null
+++ b/apps/__init__.py
@@ -0,0 +1,3 @@
+# @Time : 2018/10/17 14:54
+# @Author : RobbieHan
+# @File : __init__.py.py
\ No newline at end of file
diff --git a/apps/__pycache__/__init__.cpython-36.pyc b/apps/__pycache__/__init__.cpython-36.pyc
new file mode 100644
index 0000000..2bf8b37
Binary files /dev/null and b/apps/__pycache__/__init__.cpython-36.pyc differ
diff --git a/apps/system/__init__.py b/apps/system/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/apps/system/__pycache__/__init__.cpython-36.pyc b/apps/system/__pycache__/__init__.cpython-36.pyc
new file mode 100644
index 0000000..cde341e
Binary files /dev/null and b/apps/system/__pycache__/__init__.cpython-36.pyc differ
diff --git a/apps/system/__pycache__/admin.cpython-36.pyc b/apps/system/__pycache__/admin.cpython-36.pyc
new file mode 100644
index 0000000..16f30ce
Binary files /dev/null and b/apps/system/__pycache__/admin.cpython-36.pyc differ
diff --git a/apps/system/__pycache__/apps.cpython-36.pyc b/apps/system/__pycache__/apps.cpython-36.pyc
new file mode 100644
index 0000000..db16f95
Binary files /dev/null and b/apps/system/__pycache__/apps.cpython-36.pyc differ
diff --git a/apps/system/__pycache__/forms.cpython-36.pyc b/apps/system/__pycache__/forms.cpython-36.pyc
new file mode 100644
index 0000000..a3a0516
Binary files /dev/null and b/apps/system/__pycache__/forms.cpython-36.pyc differ
diff --git a/apps/system/__pycache__/mixin.cpython-36.pyc b/apps/system/__pycache__/mixin.cpython-36.pyc
new file mode 100644
index 0000000..2158f26
Binary files /dev/null and b/apps/system/__pycache__/mixin.cpython-36.pyc differ
diff --git a/apps/system/__pycache__/models.cpython-36.pyc b/apps/system/__pycache__/models.cpython-36.pyc
new file mode 100644
index 0000000..1ac937f
Binary files /dev/null and b/apps/system/__pycache__/models.cpython-36.pyc differ
diff --git a/apps/system/__pycache__/views_user.cpython-36.pyc b/apps/system/__pycache__/views_user.cpython-36.pyc
new file mode 100644
index 0000000..b237f4a
Binary files /dev/null and b/apps/system/__pycache__/views_user.cpython-36.pyc differ
diff --git a/apps/system/admin.py b/apps/system/admin.py
new file mode 100644
index 0000000..8c38f3f
--- /dev/null
+++ b/apps/system/admin.py
@@ -0,0 +1,3 @@
+from django.contrib import admin
+
+# Register your models here.
diff --git a/apps/system/apps.py b/apps/system/apps.py
new file mode 100644
index 0000000..19fc95d
--- /dev/null
+++ b/apps/system/apps.py
@@ -0,0 +1,5 @@
+from django.apps import AppConfig
+
+
+class SystemConfig(AppConfig):
+ name = 'apps.system'
diff --git a/apps/system/forms.py b/apps/system/forms.py
new file mode 100644
index 0000000..5454481
--- /dev/null
+++ b/apps/system/forms.py
@@ -0,0 +1,10 @@
+# @Time : 2018/10/17 23:13
+# @Author : RobbieHan
+# @File : forms.py
+
+from django import forms
+
+
+class LoginForm(forms.Form):
+ username = forms.CharField(required=True, error_messages={"requeired": "请填写用户名"})
+ password = forms.CharField(required=True, error_messages={"requeired": "请填写密码"})
\ No newline at end of file
diff --git a/apps/system/migrations/0001_initial.py b/apps/system/migrations/0001_initial.py
new file mode 100644
index 0000000..602f579
--- /dev/null
+++ b/apps/system/migrations/0001_initial.py
@@ -0,0 +1,112 @@
+# Generated by Django 2.1.2 on 2018-10-17 15:09
+
+from django.conf import settings
+import django.contrib.auth.models
+import django.contrib.auth.validators
+from django.db import migrations, models
+import django.db.models.deletion
+import django.utils.timezone
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ ('auth', '0009_alter_user_last_name_max_length'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='UserProfile',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('password', models.CharField(max_length=128, verbose_name='password')),
+ ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
+ ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
+ ('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')),
+ ('first_name', models.CharField(blank=True, max_length=30, verbose_name='first name')),
+ ('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')),
+ ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')),
+ ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')),
+ ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),
+ ('name', models.CharField(default='', max_length=20, verbose_name='姓名')),
+ ('birthday', models.DateField(blank=True, null=True, verbose_name='出生日期')),
+ ('gender', models.CharField(choices=[('male', '男'), ('female', '女')], default='male', max_length=10, verbose_name='性别')),
+ ('mobile', models.CharField(default='', max_length=11, verbose_name='手机号码')),
+ ('email', models.EmailField(max_length=50, verbose_name='邮箱')),
+ ('image', models.ImageField(blank=True, default='image/default.jpg', null=True, upload_to='image/%Y/%m')),
+ ('post', models.CharField(blank=True, max_length=50, null=True, verbose_name='职位')),
+ ],
+ options={
+ 'verbose_name': '用户信息',
+ 'verbose_name_plural': '用户信息',
+ 'ordering': ['id'],
+ },
+ managers=[
+ ('objects', django.contrib.auth.models.UserManager()),
+ ],
+ ),
+ migrations.CreateModel(
+ name='Menu',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.CharField(max_length=30, unique=True, verbose_name='菜单名')),
+ ('icon', models.CharField(blank=True, max_length=50, null=True, verbose_name='图标')),
+ ('code', models.CharField(blank=True, max_length=50, null=True, verbose_name='编码')),
+ ('url', models.CharField(blank=True, max_length=128, null=True, unique=True)),
+ ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='system.Menu', verbose_name='父菜单')),
+ ],
+ options={
+ 'verbose_name': '菜单',
+ 'verbose_name_plural': '菜单',
+ },
+ ),
+ migrations.CreateModel(
+ name='Role',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.CharField(max_length=32, unique=True, verbose_name='角色')),
+ ('desc', models.CharField(blank=True, max_length=50, null=True, verbose_name='描述')),
+ ('permissions', models.ManyToManyField(blank=True, to='system.Menu', verbose_name='URL授权')),
+ ],
+ ),
+ migrations.CreateModel(
+ name='Structure',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.CharField(max_length=60, verbose_name='名称')),
+ ('type', models.CharField(choices=[('unit', '单位'), ('department', '部门')], default='department', max_length=20, verbose_name='类型')),
+ ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='system.Structure', verbose_name='父类架构')),
+ ],
+ options={
+ 'verbose_name': '组织架构',
+ 'verbose_name_plural': '组织架构',
+ },
+ ),
+ migrations.AddField(
+ model_name='userprofile',
+ name='department',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='system.Structure', verbose_name='部门'),
+ ),
+ migrations.AddField(
+ model_name='userprofile',
+ name='groups',
+ field=models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups'),
+ ),
+ migrations.AddField(
+ model_name='userprofile',
+ name='roles',
+ field=models.ManyToManyField(blank=True, to='system.Role', verbose_name='角色'),
+ ),
+ migrations.AddField(
+ model_name='userprofile',
+ name='superior',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='上级主管'),
+ ),
+ migrations.AddField(
+ model_name='userprofile',
+ name='user_permissions',
+ field=models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions'),
+ ),
+ ]
diff --git a/apps/system/migrations/__init__.py b/apps/system/migrations/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/apps/system/migrations/__pycache__/0001_initial.cpython-36.pyc b/apps/system/migrations/__pycache__/0001_initial.cpython-36.pyc
new file mode 100644
index 0000000..89ab794
Binary files /dev/null and b/apps/system/migrations/__pycache__/0001_initial.cpython-36.pyc differ
diff --git a/apps/system/migrations/__pycache__/__init__.cpython-36.pyc b/apps/system/migrations/__pycache__/__init__.cpython-36.pyc
new file mode 100644
index 0000000..82a4459
Binary files /dev/null and b/apps/system/migrations/__pycache__/__init__.cpython-36.pyc differ
diff --git a/apps/system/mixin.py b/apps/system/mixin.py
new file mode 100644
index 0000000..8edb514
--- /dev/null
+++ b/apps/system/mixin.py
@@ -0,0 +1,12 @@
+# @Time : 2018/10/17 15:15
+# @Author : RobbieHan
+# @File : mixin.py.py
+
+from django.contrib.auth.decorators import login_required
+
+
+class LoginRequiredMixin(object):
+ @classmethod
+ def as_view(cls, **init_kwargs):
+ view = super(LoginRequiredMixin, cls).as_view(**init_kwargs)
+ return login_required(view)
\ No newline at end of file
diff --git a/apps/system/models.py b/apps/system/models.py
new file mode 100644
index 0000000..74d1d67
--- /dev/null
+++ b/apps/system/models.py
@@ -0,0 +1,73 @@
+from django.db import models
+from django.contrib.auth.models import AbstractUser
+
+
+class Menu(models.Model):
+ """
+ 菜单
+ """
+ name = models.CharField(max_length=30, unique=True, verbose_name="菜单名") # unique=True, 这个字段在表中必须有唯一值.
+ parent = models.ForeignKey("self", null=True, blank=True, on_delete=models.SET_NULL, verbose_name="父菜单")
+ icon = models.CharField(max_length=50, null=True, blank=True, verbose_name="图标")
+ code = models.CharField(max_length=50, null=True, blank=True, verbose_name="编码")
+ url = models.CharField(max_length=128, unique=True, null=True, blank=True)
+
+ def __str__(self):
+ return self.name
+
+ class Meta:
+ verbose_name = '菜单'
+ verbose_name_plural = verbose_name
+
+ @classmethod
+ def get_menu_by_request_url(cls, url):
+ return dict(menu=Menu.objects.get(url=url))
+
+
+class Role(models.Model):
+ """
+ 角色:用于权限绑定
+ """
+ name = models.CharField(max_length=32, unique=True, verbose_name="角色")
+ permissions = models.ManyToManyField("menu", blank=True, verbose_name="URL授权")
+ desc = models.CharField(max_length=50, blank=True, null=True, verbose_name="描述")
+
+
+class Structure(models.Model):
+ """
+ 组织架构
+ """
+ type_choices = (("unit", "单位"), ("department", "部门"))
+ name = models.CharField(max_length=60, verbose_name="名称")
+ type = models.CharField(max_length=20, choices=type_choices, default="department", verbose_name="类型")
+ parent = models.ForeignKey("self", null=True, blank=True, on_delete=models.SET_NULL, verbose_name="父类架构")
+
+ class Meta:
+ verbose_name = "组织架构"
+ verbose_name_plural = verbose_name
+
+ def __str__(self):
+ return self.name
+
+
+class UserProfile(AbstractUser):
+ name = models.CharField(max_length=20, default="", verbose_name="姓名")
+ birthday = models.DateField(null=True, blank=True, verbose_name="出生日期")
+ gender = models.CharField(max_length=10, choices=(("male", "男"), ("female", "女")),
+ default="male", verbose_name="性别")
+ mobile = models.CharField(max_length=11, default="", verbose_name="手机号码")
+ email = models.EmailField(max_length=50, verbose_name="邮箱")
+ image = models.ImageField(upload_to="image/%Y/%m", default="image/default.jpg",
+ max_length=100, null=True, blank=True)
+ department = models.ForeignKey("Structure", null=True, blank=True, on_delete=models.SET_NULL, verbose_name="部门")
+ post = models.CharField(max_length=50, null=True, blank=True, verbose_name="职位")
+ superior = models.ForeignKey("self", null=True, blank=True, on_delete=models.SET_NULL, verbose_name="上级主管")
+ roles = models.ManyToManyField("role", verbose_name="角色", blank=True)
+
+ class Meta:
+ verbose_name = "用户信息"
+ verbose_name_plural = verbose_name
+ ordering = ['id']
+
+ def __str__(self):
+ return self.name
diff --git a/apps/system/tests.py b/apps/system/tests.py
new file mode 100644
index 0000000..7ce503c
--- /dev/null
+++ b/apps/system/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/apps/system/views.py b/apps/system/views.py
new file mode 100644
index 0000000..91ea44a
--- /dev/null
+++ b/apps/system/views.py
@@ -0,0 +1,3 @@
+from django.shortcuts import render
+
+# Create your views here.
diff --git a/apps/system/views_user.py b/apps/system/views_user.py
new file mode 100644
index 0000000..3e8999b
--- /dev/null
+++ b/apps/system/views_user.py
@@ -0,0 +1,54 @@
+# @Time : 2018/10/16 23:11
+# @Author : RobbieHan
+# @File : views_user.py
+
+from django.shortcuts import render
+from django.views.generic.base import View
+from django.http import HttpResponseRedirect
+from django.contrib.auth import authenticate, login, logout
+from django.urls import reverse
+
+from .forms import LoginForm
+from .mixin import LoginRequiredMixin
+
+
+class IndexView(LoginRequiredMixin, View):
+
+ def get(self, request):
+ return render(request, 'index.html')
+
+
+class LoginView(View):
+
+ def get(self, request):
+ if not request.user.is_authenticated:
+ return render(request, 'system/users/login.html')
+ else:
+ return HttpResponseRedirect('/')
+
+ def post(self, request):
+ redirect_to = request.GET.get('next', '/')
+ login_form = LoginForm(request.POST)
+ ret = dict(login_form=login_form)
+ if login_form.is_valid():
+ user_name = request.POST['username']
+ pass_word = request.POST['password']
+ user = authenticate(username=user_name, password=pass_word)
+ if user is not None:
+ if user.is_active:
+ login(request, user)
+ return HttpResponseRedirect(redirect_to)
+ else:
+ ret['msg'] = '用户未激活!'
+ else:
+ ret['msg'] = '用户名或密码错误!'
+ else:
+ ret['msg'] = '用户和密码不能为空!'
+ return render(request, 'system/users/login.html', ret)
+
+
+class LogoutView(View):
+
+ def get(self, request):
+ logout(request)
+ return HttpResponseRedirect(reverse('login'))
\ No newline at end of file
diff --git a/db.sqlite3 b/db.sqlite3
index 5418aaf..1c9ef1e 100644
Binary files a/db.sqlite3 and b/db.sqlite3 differ
diff --git a/sandboxMP/__pycache__/settings.cpython-36.pyc b/sandboxMP/__pycache__/settings.cpython-36.pyc
index 70d1642..844f395 100644
Binary files a/sandboxMP/__pycache__/settings.cpython-36.pyc and b/sandboxMP/__pycache__/settings.cpython-36.pyc differ
diff --git a/sandboxMP/__pycache__/urls.cpython-36.pyc b/sandboxMP/__pycache__/urls.cpython-36.pyc
index 391e134..bc5d2bb 100644
Binary files a/sandboxMP/__pycache__/urls.cpython-36.pyc and b/sandboxMP/__pycache__/urls.cpython-36.pyc differ
diff --git a/sandboxMP/settings.py b/sandboxMP/settings.py
index ef5fd4d..4a4130a 100644
--- a/sandboxMP/settings.py
+++ b/sandboxMP/settings.py
@@ -11,10 +11,12 @@ https://docs.djangoproject.com/en/2.1/ref/settings/
"""
import os
+import sys
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/2.1/howto/deployment/checklist/
@@ -37,6 +39,7 @@ INSTALLED_APPS = [
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
+ 'apps.system.apps.SystemConfig',
]
MIDDLEWARE = [
@@ -51,6 +54,8 @@ MIDDLEWARE = [
ROOT_URLCONF = 'sandboxMP.urls'
+AUTH_USER_MODEL = 'system.UserProfile'
+
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
@@ -121,3 +126,9 @@ USE_TZ = False
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
+
+MEDIA_URL = '/media/'
+
+MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
+
+LOGIN_URL = '/login/'
diff --git a/sandboxMP/urls.py b/sandboxMP/urls.py
index c4bf542..0f31823 100644
--- a/sandboxMP/urls.py
+++ b/sandboxMP/urls.py
@@ -15,7 +15,21 @@ Including another URLconf
"""
from django.contrib import admin
from django.urls import path
+from django.conf import settings
+from django.urls import re_path
+from django.views.static import serve
+
+from system.views_user import IndexView, LoginView, LogoutView
urlpatterns = [
path('admin/', admin.site.urls),
+ path('', IndexView.as_view(), name='index'),
+ path('login/', LoginView.as_view(), name='login'),
+ path('logout/', LogoutView.as_view(), name='logout'),
]
+
+if settings.DEBUG:
+ urlpatterns += [
+ re_path(r'^media/(?P.*)$', serve, {"document_root": settings.MEDIA_ROOT}),
+
+ ]
\ No newline at end of file