Skip to content

Commit aea10e8

Browse files
committed
2 parents ba6e9dc + af19d41 commit aea10e8

13 files changed

Lines changed: 118 additions & 11 deletions

File tree

Pipfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ Flask = "==1.0.2"
1212
Flask-SQLAlchemy = "==2.3.2"
1313
Flask-WTF = "==0.14.2"
1414
Flask-Cors = "==2.1.0"
15-
Lin-CMS = "==0.1.1b1"
15+
Lin-CMS = "==0.1.1b3"
1616

1717
[dev-packages]
1818
pytest = "*"

README.md

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,9 @@ Lin-CMS 是林间有风团队经过大量项目实践所提炼出的一套**内
3535

3636
## 最新版本
3737

38-
核心库:0.1.1b1
38+
核心库:0.1.1b3
3939

40-
示例工程:0.1.0-beta.1
40+
示例工程:0.1.0-beta.2
4141

4242

4343
### 文档地址
@@ -48,6 +48,18 @@ Lin-CMS 是林间有风团队经过大量项目实践所提炼出的一套**内
4848

4949
[http://face.cms.7yue.pro/](http://face.cms.7yue.pro/)
5050

51+
### QQ 交流群
52+
53+
QQ 群号:643205479
54+
55+
<img class="QR-img" width="258" height="300" src="http://imglf3.nosdn0.126.net/img/Qk5LWkJVWkF3Nmdyc2xGcUtScEJLOVV1clErY1dJa0FsQ3E1aDZQWlZHZ2dCbSt4WXA1V3dRPT0.jpg?imageView&thumbnail=1680x0&quality=96&stripmeta=0&type=jpg">
56+
57+
### 微信公众号
58+
59+
微信搜索:林间有风
60+
61+
<img class="QR-img" src="http://imglf6.nosdn0.126.net/img/YUdIR2E3ME5weEdlNThuRmI4TFh3UWhiNmladWVoaTlXUXpicEFPa1F6czFNYkdmcWRIbGRRPT0.jpg?imageView&thumbnail=500x0&quality=96&stripmeta=0&type=jpg">
62+
5163
### Lin CMS 的特点
5264

5365
Lin CMS 的构筑思想是有其自身特点的。下面我们阐述一些 Lin 的主要特点。
@@ -165,4 +177,4 @@ pipenv shell
165177

166178
## 下个版本开发计划
167179

168-
- [ ] 调整 jwt 机制,增强灵活性
180+
- [ ] 系统访问日志、错误日志

app/api/cms/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,11 @@ def create_cms():
1313
from .admin import admin_api
1414
from .user import user_api
1515
from .log import log_api
16+
from .file import file_api
1617
from .test import test_api
1718
admin_api.register(cms)
1819
user_api.register(cms)
1920
log_api.register(cms)
21+
file_api.register(cms)
2022
test_api.register(cms)
2123
return cms

app/api/cms/admin.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ def get_admin_users():
5555
for user, group_name in users:
5656
setattr(user, 'group_name', group_name)
5757
user._fields.append('group_name')
58-
user.hide('update_time', 'delete_time')
58+
user.hide('update_time')
5959
user_and_group.append(user)
6060
# 有分组的时候就加入分组条件
6161
# total_nums = get_total_nums(manager.user_model, is_soft=True, admin=UserAdmin.COMMON.value)

app/api/cms/file.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
"""
2+
:copyright: © 2019 by the Lin team.
3+
:license: MIT, see LICENSE for more details.
4+
"""
5+
from flask import request, jsonify
6+
from lin import login_required
7+
from lin.redprint import Redprint
8+
9+
from app.extensions.file.local_uploader import LocalUploader
10+
11+
file_api = Redprint('file')
12+
13+
14+
@file_api.route('/', methods=['POST'])
15+
@login_required
16+
def post_file():
17+
files = request.files
18+
uploader = LocalUploader(files)
19+
ret = uploader.upload()
20+
return jsonify(ret)

app/api/cms/user.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@
1717
from lin.redprint import Redprint
1818

1919
from app.libs.error_code import RefreshException
20-
from app.validators.forms import LoginForm, RegisterForm, ChangePasswordForm, UpdateInfoForm
20+
from app.validators.forms import LoginForm, RegisterForm, ChangePasswordForm, UpdateInfoForm, \
21+
AvatarUpdateForm
2122

2223
user_api = Redprint('user')
2324

@@ -136,6 +137,16 @@ def get_allowed_apis():
136137
return jsonify(user)
137138

138139

140+
@user_api.route('/avatar', methods=['PUT'])
141+
@login_required
142+
def set_avatar():
143+
form = AvatarUpdateForm().validate_for_api()
144+
user = get_current_user()
145+
with db.auto_commit():
146+
user.avatar = form.avatar.data
147+
return Success(msg='更新头像成功')
148+
149+
139150
def _register_user(form: RegisterForm):
140151
with db.auto_commit():
141152
# 注意:此处使用挂载到manager上的user_model,不可使用默认的User

app/app.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def create_tables(app):
2626

2727

2828
def create_app(register_all=True):
29-
app = Flask(__name__)
29+
app = Flask(__name__, static_folder='./assets')
3030
app.config.from_object('app.config.setting')
3131
app.config.from_object('app.config.secure')
3232
if register_all:

app/extensions/file/config.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# 文件相关配置
2+
FILE = {
3+
"STORE_DIR": 'app/assets',
4+
"SINGLE_LIMIT": 1024 * 1024 * 2,
5+
"TOTAL_LIMIT": 1024 * 1024 * 20,
6+
"NUMS": 10,
7+
"INCLUDE": set([]),
8+
"EXCLUDE": set([])
9+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
from flask import current_app
2+
from werkzeug.utils import secure_filename
3+
4+
from lin.core import File
5+
from lin.file import Uploader
6+
7+
8+
class LocalUploader(Uploader):
9+
10+
def upload(self):
11+
ret = []
12+
site_domain = current_app.config.get('SITE_DOMAIN')\
13+
if current_app.config.get('SITE_DOMAIN') else 'http://127.0.0.1:5000'
14+
for single in self._file_storage:
15+
file_md5 = self._generate_md5(single.read())
16+
single.seek(0)
17+
exists = File.query.filter_by(md5=file_md5).first()
18+
if exists:
19+
ret.append({
20+
"key": single.name,
21+
"id": exists.id,
22+
"url": site_domain + '/assets/' + exists.path
23+
})
24+
else:
25+
absolute_path, relative_path, real_name = self._get_store_path(single.filename)
26+
secure_filename(single.filename)
27+
single.save(absolute_path)
28+
file = File.create_file(
29+
name=real_name,
30+
path=relative_path,
31+
extension=self._get_ext(single.filename),
32+
size=self._get_size(single),
33+
md5=file_md5,
34+
commit=True
35+
)
36+
ret.append({
37+
"key": single.name,
38+
"id": file.id,
39+
"url": site_domain + '/assets/' + file.path
40+
})
41+
return ret

app/validators/forms.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,12 @@ class UpdateUserInfoForm(Form):
141141
])
142142

143143

144+
class AvatarUpdateForm(Form):
145+
avatar = StringField('头像', validators=[
146+
DataRequired(message='请输入头像url')
147+
])
148+
149+
144150
class BookSearchForm(Form):
145151
q = StringField(validators=[DataRequired(message='必须传入搜索关键字')]) # 前端的请求参数中必须携带`q`
146152

0 commit comments

Comments
 (0)