提交 e27582e35555adfef8834b185c224f6269f8a52f

作者 qianyingz
1 个父辈 dd7f423f

用户管理接口;登录界面优化

@@ -9,7 +9,7 @@ from .models import * @@ -9,7 +9,7 @@ from .models import *
9 from .oauth2 import authorization, require_oauth, generate_user_info 9 from .oauth2 import authorization, require_oauth, generate_user_info
10 from authlib.oauth2 import OAuth2Error 10 from authlib.oauth2 import OAuth2Error
11 from authlib.integrations.flask_oauth2 import current_token 11 from authlib.integrations.flask_oauth2 import current_token
12 -from . import user_create, client_create, client_query,user_query 12 +from . import user_create, client_create, client_query, user_query, user_update, user_delete
13 13
14 14
15 def current_user(): 15 def current_user():
@@ -107,19 +107,35 @@ class DataManager(BlueprintApi): @@ -107,19 +107,35 @@ class DataManager(BlueprintApi):
107 if not user: 107 if not user:
108 return render_template("auth/authorize.html", user=user, grant=grant) 108 return render_template("auth/authorize.html", user=user, grant=grant)
109 # return render_template("auth/login1.html", user=user, grant=grant) 109 # return render_template("auth/login1.html", user=user, grant=grant)
110 - if not user and "username" in request.form:  
111 - username = request.form.get("username")  
112 - password = request.form.get("password")  
113 - user = User.query.filter_by(  
114 - username=username, password=password).first()  
115 - if User: 110 + error = ""
  111 + if not user:
  112 + if not "username" in request.form or not request.form.get("username"):
  113 + error = "用户名不可为空"
  114 + elif not "password" in request.form or not request.form.get("password"):
  115 + error = "密码不可为空"
  116 + else:
  117 + username = request.form.get("username")
  118 + password = request.form.get("password")
  119 + user = User.query.filter_by(
  120 + username=username, password=password).first()
  121 + if not user:
  122 + error = "账号或密码不正确"
  123 +
  124 + if user:
116 session["id"] = user.id 125 session["id"] = user.id
117 - grant_user = user 126 + grant_user = user
  127 + return authorization.create_authorization_response(grant_user=grant_user)
  128 +
  129 + try:
  130 + grant = authorization.validate_consent_request(end_user=user)
  131 + except OAuth2Error as error:
  132 + return jsonify(dict(error.get_body()))
  133 + return render_template("auth/authorize.html", user=user, grant=grant, error=error)
  134 +
118 # if request.form["confirm"]: 135 # if request.form["confirm"]:
119 # grant_user = user 136 # grant_user = user
120 # else: 137 # else:
121 # grant_user = None 138 # grant_user = None
122 - return authorization.create_authorization_response(grant_user=grant_user)  
123 139
124 @staticmethod 140 @staticmethod
125 @bp.route("/token", methods=["POST"]) 141 @bp.route("/token", methods=["POST"])
@@ -177,8 +193,7 @@ class DataManager(BlueprintApi): @@ -177,8 +193,7 @@ class DataManager(BlueprintApi):
177 获取用户列表 193 获取用户列表
178 """ 194 """
179 return user_query.Api().result 195 return user_query.Api().result
180 -  
181 - 196 +
182 @staticmethod 197 @staticmethod
183 @bp.route("/users", methods=["POST"]) 198 @bp.route("/users", methods=["POST"])
184 @swag_from(user_create.Api.api_doc) 199 @swag_from(user_create.Api.api_doc)
@@ -189,6 +204,24 @@ class DataManager(BlueprintApi): @@ -189,6 +204,24 @@ class DataManager(BlueprintApi):
189 return user_create.Api().result 204 return user_create.Api().result
190 205
191 @staticmethod 206 @staticmethod
  207 + @bp.route("/userEdit", methods=["POST"])
  208 + @swag_from(user_update.Api.api_doc)
  209 + def user_update():
  210 + """
  211 + 更新用户信息
  212 + """
  213 + return user_update.Api().result
  214 +
  215 + @staticmethod
  216 + @bp.route("/userDelete", methods=["POST"])
  217 + @swag_from(user_delete.Api.api_doc)
  218 + def user_delete():
  219 + """
  220 + 删除用户
  221 + """
  222 + return user_delete.Api().result
  223 +
  224 + @staticmethod
192 @bp.route("/client", methods=["POST"]) 225 @bp.route("/client", methods=["POST"])
193 @swag_from(client_create.Api.api_doc) 226 @swag_from(client_create.Api.api_doc)
194 def client_create(): 227 def client_create():
@@ -5,6 +5,7 @@ @@ -5,6 +5,7 @@
5 5
6 from .models import * 6 from .models import *
7 from app.util.component.ApiTemplate import ApiTemplate 7 from app.util.component.ApiTemplate import ApiTemplate
  8 +import time
8 9
9 10
10 class Api(ApiTemplate): 11 class Api(ApiTemplate):
@@ -13,8 +14,8 @@ class Api(ApiTemplate): @@ -13,8 +14,8 @@ class Api(ApiTemplate):
13 def para_check(self): 14 def para_check(self):
14 if not self.para.get("username"): 15 if not self.para.get("username"):
15 raise Exception("username is null") 16 raise Exception("username is null")
16 - if not self.para.get("password"):  
17 - raise Exception("password is null") 17 + if not self.para.get("pwd"):
  18 + raise Exception("pwd is null")
18 if not self.para.get("role"): 19 if not self.para.get("role"):
19 raise Exception("role is null") 20 raise Exception("role is null")
20 21
@@ -26,17 +27,26 @@ class Api(ApiTemplate): @@ -26,17 +27,26 @@ class Api(ApiTemplate):
26 try: 27 try:
27 # 业务逻辑 28 # 业务逻辑
28 username = self.para.get("username") 29 username = self.para.get("username")
29 - password = self.para.get("password") 30 + password = self.para.get("pwd")
30 role = self.para.get("role") 31 role = self.para.get("role")
  32 + company = self.para.get("company", None)
  33 + position = self.para.get("position", None)
  34 + email = self.para.get("email", None)
  35 + phone = self.para.get("phone", None)
31 # 是否重名 36 # 是否重名
32 - if(len(User.query.filter_by(username=username).all()) > 0): 37 + if(User.query.filter_by(username=username).one_or_none()):
33 res["msg"] = "username 已存在" 38 res["msg"] = "username 已存在"
34 else: 39 else:
35 - user = User(username=username, password=password, role=role) 40 + user = User(username=username, password=password, role=role,
  41 + phone=phone, company=company, position=position, email=email,
  42 + create_time=time.strftime(
  43 + "%Y-%m-%d %H:%M:%S", time.localtime()),
  44 + update_time=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
36 db.session.add(user) 45 db.session.add(user)
37 db.session.commit() 46 db.session.commit()
38 res["msg"] = "用户创建成功" 47 res["msg"] = "用户创建成功"
39 - res["data"] = {user.id, user.username, user.role} 48 + res["data"] = {"id": user.id,
  49 + "username": user.username, "role": user.role}
40 res["result"] = True 50 res["result"] = True
41 except Exception as e: 51 except Exception as e:
42 db.session.rollback() 52 db.session.rollback()
@@ -52,7 +62,7 @@ class Api(ApiTemplate): @@ -52,7 +62,7 @@ class Api(ApiTemplate):
52 "type": "string", 62 "type": "string",
53 "description": "用户名", 63 "description": "用户名",
54 "required": "true"}, 64 "required": "true"},
55 - {"name": "password", 65 + {"name": "pwd",
56 "in": "formData", 66 "in": "formData",
57 "type": "string", 67 "type": "string",
58 "description": "密码", 68 "description": "密码",
@@ -61,7 +71,27 @@ class Api(ApiTemplate): @@ -61,7 +71,27 @@ class Api(ApiTemplate):
61 "in": "formData", 71 "in": "formData",
62 "type": "string", 72 "type": "string",
63 "description": "角色", 73 "description": "角色",
64 - "required": "true"} 74 + "required": "true"},
  75 + {"name": "company",
  76 + "in": "formData",
  77 + "type": "string",
  78 + "description": "单位",
  79 + "required": ""},
  80 + {"name": "email",
  81 + "in": "formData",
  82 + "type": "string",
  83 + "description": "邮件",
  84 + "required": ""},
  85 + {"name": "phone",
  86 + "in": "formData",
  87 + "type": "string",
  88 + "description": "电话",
  89 + "required": ""},
  90 + {"name": "position",
  91 + "in": "formData",
  92 + "type": "string",
  93 + "description": "职位",
  94 + "required": ""},
65 ], 95 ],
66 "responses": { 96 "responses": {
67 200: { 97 200: {
  1 +from app.util.component.ApiTemplate import ApiTemplate
  2 +import time
  3 +from .models import *
  4 +
  5 +
  6 +class Api(ApiTemplate):
  7 + api_name = "更新用户信息"
  8 +
  9 + def para_check(self):
  10 + if not self.para.get("guid"):
  11 + raise Exception("guid is null")
  12 + return super().para_check()
  13 +
  14 + def process(self):
  15 + res = {}
  16 + res["result"] = False
  17 + try:
  18 + user_guid = int(self.para.get("guid"))
  19 + userinfo = User.query.filter_by(id=user_guid).one_or_none()
  20 + if not userinfo:
  21 + res["msg"] = "用户不存在"
  22 + else:
  23 + db.session.delete(userinfo)
  24 + db.session.commit()
  25 + res["result"] = True
  26 + res["msg"] = "删除用户成功"
  27 + except Exception as e:
  28 + db.session.rollback()
  29 + raise e
  30 + return res
  31 +
  32 + api_doc = {
  33 + "tags": ["认证接口"],
  34 + "parameters": [
  35 + {"name": "guid",
  36 + "in": "formData",
  37 + "type": "string",
  38 + "description": "用户id",
  39 + "required": "true"}
  40 + ],
  41 + "responses": {
  42 + 200: {
  43 + "schema": {
  44 + "properties": {
  45 + }
  46 + }
  47 + }
  48 + }
  49 + }
@@ -21,15 +21,17 @@ class Api(ApiTemplate): @@ -21,15 +21,17 @@ class Api(ApiTemplate):
21 try: 21 try:
22 # 业务逻辑 22 # 业务逻辑
23 pass 23 pass
24 - page_index = int(self.para.get("pageIndex", "0"))  
25 - page_size = int(self.para.get("pageSize", "1000")) 24 + page_index = int(self.para.get("page_index", "0"))
  25 + page_size = int(self.para.get("page_size", "1000"))
26 name = self.para.get("name") 26 name = self.para.get("name")
27 id = self.para.get('guid') 27 id = self.para.get('guid')
28 28
29 if id: 29 if id:
30 tmp_user = User.query.filter_by(id=id).first() 30 tmp_user = User.query.filter_by(id=id).first()
31 - res["data"] = {"id": tmp_user.id, "username": tmp_user.username,  
32 - "role": tmp_user.role} 31 + res["data"] = {"guid": tmp_user.id, "username": tmp_user.username,
  32 + "role": tmp_user.role, "company": tmp_user.company,
  33 + "position": tmp_user.position, "email": tmp_user.email,
  34 + "phone": tmp_user.phone}
33 else: 35 else:
34 # 获取集合 36 # 获取集合
35 userLinq = User.query.order_by(User.id.desc()) 37 userLinq = User.query.order_by(User.id.desc())
@@ -42,7 +44,7 @@ class Api(ApiTemplate): @@ -42,7 +44,7 @@ class Api(ApiTemplate):
42 res["data"] = { 44 res["data"] = {
43 "count": tmp_count, 45 "count": tmp_count,
44 "list": list(map(lambda t: 46 "list": list(map(lambda t:
45 - {"id": t.id, "username": t.username, 47 + {"guid": t.id, "username": t.username,
46 "role": t.role}, 48 "role": t.role},
47 tmp_list))} 49 tmp_list))}
48 res["result"] = True 50 res["result"] = True
  1 +from app.util.component.ApiTemplate import ApiTemplate
  2 +import time
  3 +from .models import *
  4 +
  5 +
  6 +class Api(ApiTemplate):
  7 + api_name = "更新用户信息"
  8 +
  9 + def para_check(self):
  10 + if not self.para.get("guid"):
  11 + raise Exception("guid is null")
  12 + return super().para_check()
  13 +
  14 + def process(self):
  15 + res = {}
  16 + res["result"] = False
  17 + try:
  18 + user_guid = int(self.para.get("guid"))
  19 + obj_value = {"company": "company", "email": "email",
  20 + "position": "position", "phone": "phone", "password": "pwd"}
  21 +
  22 + userinfo = User.query.filter_by(id=user_guid)
  23 + if not userinfo.one_or_none():
  24 + res["msg"] = "数据不存在"
  25 + else:
  26 + for key in obj_value:
  27 + if self.para.__contains__(obj_value[key]):
  28 + value = self.para.get(obj_value[key])
  29 + value = value if value is "None" or value is "none" else None
  30 + userinfo.update({key: value})
  31 + db.session.commit()
  32 + res["result"] = True
  33 + res["msg"] = "更新用户信息成功"
  34 + except Exception as e:
  35 + db.session.rollback()
  36 + raise e
  37 + return res
  38 +
  39 + api_doc = {
  40 + "tags": ["认证接口"],
  41 + "parameters": [
  42 + {"name": "guid",
  43 + "in": "formData",
  44 + "type": "string",
  45 + "description": "用户id",
  46 + "required": "true"},
  47 + {"name": "pwd",
  48 + "in": "formData",
  49 + "type": "string",
  50 + "description": "密码",
  51 + "required": ""},
  52 + {"name": "company",
  53 + "in": "formData",
  54 + "type": "string",
  55 + "description": "单位",
  56 + "required": ""},
  57 + {"name": "email",
  58 + "in": "formData",
  59 + "type": "string",
  60 + "description": "邮件",
  61 + "required": ""},
  62 + {"name": "phone",
  63 + "in": "formData",
  64 + "type": "string",
  65 + "description": "电话",
  66 + "required": ""},
  67 + {"name": "position",
  68 + "in": "formData",
  69 + "type": "string",
  70 + "description": "职位",
  71 + "required": ""},
  72 + ],
  73 + "responses": {
  74 + 200: {
  75 + "schema": {
  76 + "properties": {
  77 + }
  78 + }
  79 + }
  80 + }
  81 + }
1 -html,  
2 -body {  
3 - font-family: Microsoft YaHei Regular, Microsoft YaHei Regular-Regular;  
4 -}  
5 -  
6 -html,  
7 -body,  
8 -p,  
9 -input {  
10 - margin: 0;  
11 - padding: 0;  
12 -}  
13 -  
14 -.login {  
15 - background: url(../images/login_background.png) no-repeat;  
16 - background-size: 100% 100%;  
17 - width: 100%;  
18 - height: 100%;  
19 - position: relative;  
20 -}  
21 -  
22 -.login-container {  
23 - position: absolute;  
24 - top: -50px;  
25 - bottom: 0;  
26 - left: 0;  
27 - right: 0;  
28 - margin: auto;  
29 - width: 900px;  
30 - height: 454px;  
31 - background: #ffffff;  
32 - border-radius: 4px;  
33 - box-shadow: 2px 0 21px 0 rgba(38, 106, 184, 0.53);  
34 -}  
35 -  
36 -.login-container-logo {  
37 - margin: 0;  
38 - background: url(../images/login_logo.png) no-repeat;  
39 - width: 401px;  
40 - height: 455px;  
41 - overflow: hidden;  
42 - float: left;  
43 -}  
44 -  
45 -.login-container-header {  
46 - font-size: 22px;  
47 - font-weight: 700;  
48 - text-align: left;  
49 - color: #545454;  
50 - letter-spacing: 1px;  
51 - text-align: center;  
52 - margin-bottom: 54px;  
53 -}  
54 -  
55 -.login-container-form {  
56 - margin-left: 401px;  
57 - height: 100%;  
58 - padding: 80px;  
59 -}  
60 -  
61 -.login-container-form .form-group {  
62 - width: 296px;  
63 - margin: 0 auto;  
64 - margin-top: 22px;  
65 -}  
66 -  
67 -.login-container-form .has-feedback.feedback-left .form-control-feedback {  
68 - left: 0;  
69 - right: auto;  
70 - width: 38px;  
71 - height: 45px;  
72 - line-height: 45px;  
73 - z-index: 4;  
74 - color: #dcdcdc;  
75 - font-size: 16px;  
76 -}  
77 -  
78 -.login-container-form .has-feedback.feedback-left .micons-pwd {  
79 - font-size: 18px;  
80 - line-height: 48px;  
81 -}  
82 -  
83 -.login-container-form .has-feedback.feedback-left .form-control {  
84 - padding-left: 38px;  
85 - padding-right: 12px;  
86 - border: 1px solid #ebebeb;  
87 - border-radius: 4px;  
88 - height: 45px;  
89 - color: #999;  
90 - font-size: 16px;  
91 - letter-spacing: 1px;  
92 -}  
93 -  
94 -.login-container-form .has-feedback.feedback-left .form-control:hover,  
95 -.login-container-form .has-feedback.feedback-left .form-control:hover,  
96 -.login-container-form .has-feedback.feedback-left .form-control:focus {  
97 - border: 1px solid #3081c3;  
98 - outline: unset;  
99 - box-shadow: unset;  
100 -}  
101 -  
102 -.login-container-form .overhidden {  
103 - padding-left: 24px;  
104 - font-size: 14px;  
105 - color: #999999;  
106 - vertical-align: bottom;  
107 - line-height: 18px;  
108 -}  
109 -  
110 -.login-container-form .overhidden:hover {  
111 - color: #3081c3;  
112 -}  
113 -  
114 -.login-container-form .ftdms-checkbox span::before {  
115 - height: 15px;  
116 - width: 15px;  
117 - border-width: 1px;  
118 - top: 2px;  
119 -}  
120 -  
121 -#btn-login {  
122 - background: #3081c3;  
123 - height: 45px;  
124 - font-size: 16px;  
125 - font-weight: 400;  
126 - color: #ffffff;  
127 - letter-spacing: 1px;  
128 -}  
129 -  
130 -#btn-login:hover {  
131 - background: #2ba3f6;  
132 -}  
133 -  
134 -.form-control:focus,  
135 -.form-control:hover {  
136 - box-shadow: unset;  
137 - border: 1px solid #3081c3 !important;  
138 -}  
139 -  
140 -.form-control {  
141 - width: 100%;  
142 -}  
143 -  
144 -.btn-info.btn-info:active {  
145 - border: 1px solid;  
146 -}  
147 -  
148 -.btn {  
149 - padding: 8px 12px;  
150 - border-radius: 2px;  
151 - outline: none !important;  
152 - -webkit-transition: 0.15s linear;  
153 - transition: 0.15s linear;  
154 -}  
155 -  
156 -button {  
157 - display: block;  
158 - width: 100%;  
159 - margin-bottom: 0;  
160 - line-height: 1.42857143;  
161 - text-align: center;  
162 - white-space: nowrap;  
163 - touch-action: manipulation;  
164 - cursor: pointer;  
165 - user-select: none;  
166 - font-family: inherit;  
167 - overflow: visible;  
168 - margin: 0;  
169 - font: inherit;  
170 - outline: none !important;  
171 -}  
172 -  
173 -.ftdms-checkbox span::before,  
174 -.ftdms-radio span::before {  
175 - content: '';  
176 - position: absolute;  
177 - display: inline-block;  
178 - height: 18px;  
179 - width: 18px;  
180 - left: 0.5px;  
181 - top: 0px;  
182 - border: 2px solid #ebebeb;  
183 - -webkit-transition: all 0.1s;  
184 - -o-transition: all 0.1s;  
185 - transition: all 0.1s;  
186 -}  
187 -  
188 -:after,  
189 -:before {  
190 - -webkit-box-sizing: border-box;  
191 - -moz-box-sizing: border-box;  
192 - box-sizing: border-box; 1 +html,
  2 +body {
  3 + font-family: Microsoft YaHei Regular, Microsoft YaHei Regular-Regular;
  4 +}
  5 +
  6 +html,
  7 +body,
  8 +p,
  9 +input {
  10 + margin: 0;
  11 + padding: 0;
  12 +}
  13 +
  14 +.login {
  15 + background: url(../images/login_background.png) no-repeat;
  16 + background-size: 100% 100%;
  17 + width: 100%;
  18 + height: 100%;
  19 + position: relative;
  20 +}
  21 +
  22 +.login-container {
  23 + position: absolute;
  24 + top: -50px;
  25 + bottom: 0;
  26 + left: 0;
  27 + right: 0;
  28 + margin: auto;
  29 + width: 900px;
  30 + height: 454px;
  31 + background: #ffffff;
  32 + border-radius: 4px;
  33 + box-shadow: 2px 0 21px 0 rgba(38, 106, 184, 0.53);
  34 +}
  35 +
  36 +.login-container-logo {
  37 + margin: 0;
  38 + background: url(../images/login_logo.png) no-repeat;
  39 + width: 401px;
  40 + height: 455px;
  41 + overflow: hidden;
  42 + float: left;
  43 +}
  44 +
  45 +.login-container-header {
  46 + font-size: 22px;
  47 + font-weight: 700;
  48 + text-align: left;
  49 + color: #545454;
  50 + letter-spacing: 1px;
  51 + text-align: center;
  52 + margin-bottom: 54px;
  53 +}
  54 +
  55 +.login-container-form {
  56 + margin-left: 401px;
  57 + height: 100%;
  58 + padding: 80px;
  59 +}
  60 +
  61 +.login-container-form .form-tip {
  62 + margin-left: 21.5px;
  63 + color: red;
  64 + margin-bottom: 10px;
  65 + padding: 5px 6px;
  66 + width: 296px;
  67 + background: #ffebeb;
  68 + border: 1px solid #faccc6;
  69 + font-size: 11px;
  70 + border-radius: 4px;
  71 +}
  72 +
  73 +.login-container-form .form-tip {
  74 + height: 32px;
  75 +}
  76 +
  77 +.login-container-form .form-tip p {
  78 + margin: 0 0 0 5px;
  79 + line-height: 23px;
  80 +}
  81 +
  82 +.login-container-form .form-tip p,
  83 +.login-container-form .form-tip span {
  84 + display: block;
  85 + float: left;
  86 + height: 20px;
  87 +}
  88 +
  89 +.stop {
  90 + background: url(../images/stop.png) no-repeat;
  91 + width: 20px;
  92 + height: 20px;
  93 +}
  94 +
  95 +.login-container-form .form-group {
  96 + width: 296px;
  97 + margin: 0 auto;
  98 + margin-top: 22px;
  99 +}
  100 +
  101 +.login-container-form :first-child {
  102 + margin-top: 0px;
  103 +}
  104 +
  105 +.login-container-form .has-feedback.feedback-left .form-control-feedback {
  106 + left: 0;
  107 + right: auto;
  108 + width: 38px;
  109 + height: 45px;
  110 + line-height: 45px;
  111 + z-index: 4;
  112 + color: #dcdcdc;
  113 + font-size: 16px;
  114 +}
  115 +
  116 +.login-container-form .has-feedback.feedback-left .micons-pwd {
  117 + font-size: 18px;
  118 + line-height: 48px;
  119 +}
  120 +
  121 +.login-container-form .has-feedback.feedback-left .form-control {
  122 + padding-left: 38px;
  123 + padding-right: 12px;
  124 + border: 1px solid #ebebeb;
  125 + border-radius: 4px;
  126 + height: 45px;
  127 + color: #999;
  128 + font-size: 16px;
  129 + letter-spacing: 1px;
  130 +}
  131 +
  132 +.login-container-form .has-feedback.feedback-left .form-control:hover,
  133 +.login-container-form .has-feedback.feedback-left .form-control:hover,
  134 +.login-container-form .has-feedback.feedback-left .form-control:focus {
  135 + border: 1px solid #3081c3;
  136 + outline: unset;
  137 + box-shadow: unset;
  138 +}
  139 +
  140 +.login-container-form .overhidden {
  141 + padding-left: 24px;
  142 + font-size: 14px;
  143 + color: #999999;
  144 + vertical-align: bottom;
  145 + line-height: 18px;
  146 +}
  147 +
  148 +.login-container-form .overhidden:hover {
  149 + color: #3081c3;
  150 +}
  151 +
  152 +.login-container-form .ftdms-checkbox span::before {
  153 + height: 15px;
  154 + width: 15px;
  155 + border-width: 1px;
  156 + top: 2px;
  157 +}
  158 +
  159 +#btn-login {
  160 + background: #3081c3;
  161 + height: 45px;
  162 + font-size: 16px;
  163 + font-weight: 400;
  164 + color: #ffffff;
  165 + letter-spacing: 1px;
  166 +}
  167 +
  168 +#btn-login:hover {
  169 + background: #2ba3f6;
  170 +}
  171 +
  172 +.form-control:focus,
  173 +.form-control:hover {
  174 + box-shadow: unset;
  175 + border: 1px solid #3081c3 !important;
  176 +}
  177 +
  178 +.form-control {
  179 + width: 100%;
  180 +}
  181 +
  182 +.btn-info.btn-info:active {
  183 + border: 1px solid;
  184 +}
  185 +
  186 +.btn {
  187 + padding: 8px 12px;
  188 + border-radius: 2px;
  189 + outline: none !important;
  190 + -webkit-transition: 0.15s linear;
  191 + transition: 0.15s linear;
  192 +}
  193 +
  194 +button {
  195 + display: block;
  196 + width: 100%;
  197 + margin-bottom: 0;
  198 + line-height: 1.42857143;
  199 + text-align: center;
  200 + white-space: nowrap;
  201 + touch-action: manipulation;
  202 + cursor: pointer;
  203 + user-select: none;
  204 + font-family: inherit;
  205 + overflow: visible;
  206 + margin: 0;
  207 + font: inherit;
  208 + outline: none !important;
  209 +}
  210 +
  211 +.ftdms-checkbox span::before,
  212 +.ftdms-radio span::before {
  213 + content: '';
  214 + position: absolute;
  215 + display: inline-block;
  216 + height: 18px;
  217 + width: 18px;
  218 + left: 0.5px;
  219 + top: 0px;
  220 + border: 2px solid #ebebeb;
  221 + -webkit-transition: all 0.1s;
  222 + -o-transition: all 0.1s;
  223 + transition: all 0.1s;
  224 +}
  225 +
  226 +:after,
  227 +:before {
  228 + -webkit-box-sizing: border-box;
  229 + -moz-box-sizing: border-box;
  230 + box-sizing: border-box;
193 } 231 }
1 -if (typeof(dmap) == "undefined") var dmap = {};  
2 -dmap.login = {  
3 - init: function() {  
4 - $('#btn-login').bind('click', function(e) {  
5 - let username = $("#username").val();  
6 - let password = $("#password").val();  
7 -  
8 - if (username.length <= 0 || password.length <= 0) {  
9 - tips.notify("用户名或密码不能为空", "danger", 1e3);  
10 - return false;  
11 - }  
12 -  
13 - $.post("authorize", { username: username, password: password })  
14 - });  
15 - } 1 +if (typeof(dmap) == "undefined") var dmap = {};
  2 +dmap.login = {
  3 + init: function() {
  4 + $('#btn-login').bind('click', function(e) {
  5 + let username = $("#username").val();
  6 + let password = $("#password").val();
  7 +
  8 + if (username.length <= 0 || password.length <= 0) {
  9 + tips.notify("用户名或密码不能为空", "danger", 1e3);
  10 + return false;
  11 + }
  12 +
  13 + $.post("authorize", { username: username, password: password }, function(data) {
  14 + if (!data.result) {
  15 + tips.notify("账号或密码错误", "danger", 1e3);
  16 + }
  17 + })
  18 + });
  19 + }
16 }; 20 };
1 -<html>  
2 - <head>  
3 - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />  
4 - <title>DMap Server</title>  
5 - <link  
6 - rel="stylesheet"  
7 - type="text/css"  
8 - href="{{ url_for('static', filename = 'content/css/login.css') }}"  
9 - />  
10 - <link  
11 - rel="stylesheet"  
12 - type="text/css"  
13 - href="{{ url_for('static', filename = 'content/css/font.css') }}"  
14 - />  
15 - <link  
16 - rel="stylesheet"  
17 - type="text/css"  
18 - href="{{ url_for('static', filename = 'content/css/bootstrap.min.css') }}"  
19 - />  
20 - <script src="{{ url_for('static',filename='content/js/jquery.min.js') }}"></script>  
21 - <script src="{{ url_for('static',filename='content/js/bootstrap-notify.min.js') }}"></script>  
22 - <script src="{{ url_for('static',filename='content/js/tips.js') }}"></script>  
23 - <script src="{{ url_for('static',filename='content/js/login.js') }}"></script>  
24 - </head>  
25 -</html>  
26 -  
27 -<div class="login">  
28 - <div class="login-container">  
29 - <p class="login-container-logo"></p>  
30 - <div class="login-container-form">  
31 - <p class="login-container-header">广州城市信息研究所有限公司</p>  
32 - <form action="" method="post">  
33 - <div class="form-group has-feedback feedback-left">  
34 - <input  
35 - type="text"  
36 - placeholder="用户名"  
37 - maxlength="20"  
38 - autocomplete="off"  
39 - class="form-control border-info"  
40 - name="username"  
41 - id="username"  
42 - />  
43 - <span class="micons-user form-control-feedback"></span>  
44 - </div>  
45 -  
46 - <div class="form-group has-feedback feedback-left">  
47 - <input  
48 - type="password"  
49 - placeholder="密码"  
50 - maxlength="20"  
51 - autocomplete="off"  
52 - class="form-control border-info"  
53 - id="password"  
54 - name="password"  
55 - />  
56 - <span class="micons-pwd form-control-feedback"></span>  
57 - </div>  
58 -  
59 - <div class="form-group">  
60 - <button class="btn btn-block btn-info" type="submit" id="btn-login">  
61 - 立即登录  
62 - </button>  
63 - </div>  
64 - </form>  
65 - </div>  
66 - <div class="clear"></div>  
67 - </div>  
68 -</div>  
69 -<script>  
70 - $(function () {})  
71 -</script> 1 +<html>
  2 + <head>
  3 + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  4 + <title>DMap Server</title>
  5 + <link
  6 + rel="stylesheet"
  7 + type="text/css"
  8 + href="{{ url_for('static', filename = 'content/css/login.css') }}"
  9 + />
  10 + <link
  11 + rel="stylesheet"
  12 + type="text/css"
  13 + href="{{ url_for('static', filename = 'content/css/font.css') }}"
  14 + />
  15 + <link
  16 + rel="stylesheet"
  17 + type="text/css"
  18 + href="{{ url_for('static', filename = 'content/css/bootstrap.min.css') }}"
  19 + />
  20 + <script src="{{ url_for('static',filename='content/js/jquery.min.js') }}"></script>
  21 + <script src="{{ url_for('static',filename='content/js/bootstrap-notify.min.js') }}"></script>
  22 + <script src="{{ url_for('static',filename='content/js/tips.js') }}"></script>
  23 + <script src="{{ url_for('static',filename='content/js/login.js') }}"></script>
  24 + </head>
  25 +</html>
  26 +
  27 +<div class="login">
  28 + <div class="login-container">
  29 + <p class="login-container-logo"></p>
  30 + <div class="login-container-form">
  31 + <p class="login-container-header">广州城市信息研究所有限公司</p>
  32 +
  33 + {%if error%}
  34 + <div class="form-tip">
  35 + <span class="stop"></span>
  36 + <p>{{error}}</p>
  37 + </div>
  38 + {% endif %}
  39 +
  40 + <form action="" method="post">
  41 + <div class="form-group has-feedback feedback-left">
  42 + <input
  43 + type="text"
  44 + placeholder="用户名"
  45 + maxlength="20"
  46 + autocomplete="off"
  47 + class="form-control border-info"
  48 + name="username"
  49 + id="username"
  50 + />
  51 + <span class="micons-user form-control-feedback"></span>
  52 + </div>
  53 +
  54 + <div class="form-group has-feedback feedback-left">
  55 + <input
  56 + type="password"
  57 + placeholder="密码"
  58 + maxlength="20"
  59 + autocomplete="off"
  60 + class="form-control border-info"
  61 + id="password"
  62 + name="password"
  63 + />
  64 + <span class="micons-pwd form-control-feedback"></span>
  65 + </div>
  66 +
  67 + <div class="form-group">
  68 + <button class="btn btn-block btn-info" type="submit" id="btn-login">
  69 + 立即登录
  70 + </button>
  71 + </div>
  72 + </form>
  73 + </div>
  74 + <div class="clear"></div>
  75 + </div>
  76 +</div>
  77 +<script>
  78 + $(function () {})
  79 +</script>
@@ -7,3 +7,4 @@ app: Flask = create_app() @@ -7,3 +7,4 @@ app: Flask = create_app()
7 if __name__ == '__main__': 7 if __name__ == '__main__':
8 app.run(host="0.0.0.0", port="8840", threaded=True, debug=True) 8 app.run(host="0.0.0.0", port="8840", threaded=True, debug=True)
9 # app.run(host="0.0.0.0", port="8840", threaded=True) 9 # app.run(host="0.0.0.0", port="8840", threaded=True)
  10 +
注册登录 后发表评论