mwgencode 1.4.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. gencode/__init__.py +140 -0
  2. gencode/dd_models.py +256 -0
  3. gencode/ext.py +19 -0
  4. gencode/gen_code.py +343 -0
  5. gencode/gencode/__init__.py +0 -0
  6. gencode/gencode/export_class2swgclass.py +206 -0
  7. gencode/gencode/gen_bo_models_code.py +719 -0
  8. gencode/gencode/gen_state_code.py +171 -0
  9. gencode/gencode/gen_swagger_code.py +94 -0
  10. gencode/gencode/gen_tests_code.py +113 -0
  11. gencode/gencode/sample/__init__.py +2 -0
  12. gencode/gencode/sample/babel.cfg +3 -0
  13. gencode/gencode/sample/config-sample.ini +9 -0
  14. gencode/gencode/sample/config.ini +14 -0
  15. gencode/gencode/sample/create_new_table_run.pys +19 -0
  16. gencode/gencode/sample/dockerignore.dock +57 -0
  17. gencode/gencode/sample/file_utils.pys +396 -0
  18. gencode/gencode/sample/gencode.xmi +33 -0
  19. gencode/gencode/sample/gitignore.git +14 -0
  20. gencode/gencode/sample/migrate_run.bat +5 -0
  21. gencode/gencode/sample/migrate_run.pys +9 -0
  22. gencode/gencode/sample/requirements.txt +17 -0
  23. gencode/gencode/sample/run.sh +27 -0
  24. gencode/gencode/sample/seeds/__init__.py +0 -0
  25. gencode/gencode/sample/seeds/models_rm.pys +187 -0
  26. gencode/gencode/sample/seeds/seed_dev_data.pys +21 -0
  27. gencode/gencode/sample/seeds/seed_init.pys +17 -0
  28. gencode/gencode/sample/seeds/seed_rm.pys +39 -0
  29. gencode/gencode/sample/seeds/seed_run.pys +13 -0
  30. gencode/gencode/sample/seeds/seed_utils.pys +23 -0
  31. gencode/gencode/sample/test__init__.pys +6 -0
  32. gencode/gencode/sample/test_run.pys +4 -0
  33. gencode/gencode/sample/utils.pys +92 -0
  34. gencode/gencode/template/Dockerfile.tmp +55 -0
  35. gencode/gencode/template/README.md +91 -0
  36. gencode/gencode/template/__init__.py +0 -0
  37. gencode/gencode/template/__init__.pys +99 -0
  38. gencode/gencode/template/config.pys +134 -0
  39. gencode/gencode/template/default.conf +21 -0
  40. gencode/gencode/template/docker-compose-dev.yaml +52 -0
  41. gencode/gencode/template/docker-compose.yaml +55 -0
  42. gencode/gencode/template/drone.tmp +45 -0
  43. gencode/gencode/template/flask_models.pys +107 -0
  44. gencode/gencode/template/flask_models_base.pys +159 -0
  45. gencode/gencode/template/gen_code_flask.yaml +21 -0
  46. gencode/gencode/template/gen_code_run.pys +28 -0
  47. gencode/gencode/template/k8s-tmp.yml +141 -0
  48. gencode/gencode/template/run.pys +52 -0
  49. gencode/gencode/template/sample.mdj +1193 -0
  50. gencode/gencode/template/setup.tmp +48 -0
  51. gencode/gencode/template/supervisord.conf +21 -0
  52. gencode/gencode/template/swagger_file.yaml +195 -0
  53. gencode/gencode/template/swg_class.tmp +41 -0
  54. gencode/gencode/template/swg_ctrl_code.pys +130 -0
  55. gencode/gencode/template/swg_package_mng.tmp +4423 -0
  56. gencode/gencode/template/test_test_base.tmp +34 -0
  57. gencode/gencode/template/tests/__init__.py +0 -0
  58. gencode/gencode/template/tests/__init__.pys +5 -0
  59. gencode/gencode/template/tests/init_test_data.pys +80 -0
  60. gencode/gencode/template/tests/run.pys +4 -0
  61. gencode/gencode/template/tests/test_base.pys +87 -0
  62. gencode/gencode/template/tests/test_classmng.pys +58 -0
  63. gencode/gencode/template/uwsgi.ini +20 -0
  64. gencode/gencode/template/uwsgi_run.pys +44 -0
  65. gencode/importmdj/__init__.py +0 -0
  66. gencode/importmdj/import_dd_classes.py +369 -0
  67. gencode/importmdj/import_swagger2_class.py +371 -0
  68. gencode/importmdj/import_uml_models.py +466 -0
  69. gencode/importxmi/__init__.py +1 -0
  70. gencode/importxmi/import_classes.py +342 -0
  71. gencode/importxmi/import_sequences.py +291 -0
  72. gencode/importxmi/import_states.py +150 -0
  73. gencode/importxmi/import_swagger.py +151 -0
  74. gencode/swg2_class_models.py +179 -0
  75. gencode/uml_class_models.py +295 -0
  76. gencode/upgrade.py +113 -0
  77. gencode/utils.py +225 -0
  78. manage.py +194 -0
  79. mwgencode-1.4.1.dist-info/METADATA +325 -0
  80. mwgencode-1.4.1.dist-info/RECORD +84 -0
  81. mwgencode-1.4.1.dist-info/WHEEL +5 -0
  82. mwgencode-1.4.1.dist-info/entry_points.txt +2 -0
  83. mwgencode-1.4.1.dist-info/licenses/LICENSE.txt +19 -0
  84. mwgencode-1.4.1.dist-info/top_level.txt +2 -0
@@ -0,0 +1,396 @@
1
+
2
+ # from app import auth,p,db
3
+ from app.models import *
4
+ import os
5
+ from flask import current_app,send_file,g
6
+ import unicodedata
7
+ import urllib
8
+ from werkzeug.utils import secure_filename
9
+ from PIL import Image
10
+ from io import BytesIO
11
+ import base64
12
+ from mwutils.mw_time import get_locale_timezone
13
+
14
+ def set_timezone(json_data:dict):
15
+ '''
16
+ 为日期时间添加本地时区
17
+ :param body:
18
+ :return:
19
+ '''
20
+ for k, v in json_data.items():
21
+ if isinstance(v,datetime):
22
+ if v.tzinfo is None:
23
+ json_data[k]=v.astimezone(get_locale_timezone())
24
+ return json_data
25
+
26
+ def get_file_name_dsk(filename, path):
27
+ filename_s, ext_name = filename.rsplit('.', 1)
28
+ return os.path.join(path,
29
+ secure_filename('%s_%s.%s' % (filename_s, datetime.now().strftime('%y%m%d%H%M%S%f'), ext_name)))
30
+
31
+ def get_rate(ws, wd, hs, hd):
32
+ # 图片的压缩比率
33
+ if ws < wd or hs < hd:
34
+ return 1
35
+ # 调整比率,取最大的比率
36
+ rw = ws / wd
37
+ rh = hs / hd
38
+ return max(rw, rh)
39
+
40
+ def image_thumbnail(stream,picsize=(1024,768)):
41
+ '''
42
+ 压缩图片
43
+ :param stream: file.stream
44
+ :param picsize:
45
+ :return:
46
+ '''
47
+ pil_image = Image.open(stream)
48
+ w, h = pil_image.size
49
+ res_rate = get_rate(w, picsize[0], h, picsize[1])
50
+ pil_image.thumbnail((round(w / res_rate), round(h / res_rate)))
51
+ return pil_image
52
+
53
+ def image_to_base64(pil_img):
54
+ '''
55
+ 把PIL.image 转为base64
56
+ :param img:
57
+ :return:
58
+ '''
59
+ output_buffer = BytesIO()
60
+ pil_img.save(output_buffer, format='JPEG')
61
+ byte_data = output_buffer.getvalue()
62
+ base64_str = base64.b64encode(byte_data)
63
+ return base64_str
64
+
65
+ class docfile():
66
+ @staticmethod
67
+ def delete_doc_file(doc_file_id,autocommit=True):
68
+ '''
69
+ 删除 doc_file
70
+ :param doc_file_id: doc_file.id
71
+ :param autocommit: True 时自动commit
72
+ :return:
73
+ '''
74
+ try:
75
+ doc_file = Doc_file.query.filter(Doc_file.id == doc_file_id).first()
76
+ try:
77
+ os.remove(doc_file.save_file_name)
78
+ except Exception as e:
79
+ pass
80
+ try:
81
+ db.session.delete(doc_file)
82
+ except Exception as e:
83
+ pass
84
+ if autocommit:
85
+ db.session.commit()
86
+ except Exception as e:
87
+ db.session.rollback()
88
+ current_app.logger.error(str(e))
89
+ raise
90
+ @staticmethod
91
+ def delete_file_doclassid(docClass, docClass_id, onlydel_doc_file=False):
92
+ '''
93
+ 按关联文档id删除文档(doc_file)和引用文档的类
94
+ :param docClass : 引用类
95
+ :param docClass_id : 引用类的id
96
+ :param onlydel_doc_file : True时只删除文件(doc_file),不删除引用关系
97
+ :return:
98
+ '''
99
+ try:
100
+ docfile_ref = docClass.query.filter(docClass.id == docClass_id).first()
101
+ if docfile_ref:
102
+ doc_file = docfile_ref.doc_file
103
+ try:
104
+ os.remove(doc_file.save_file_name)
105
+ except Exception as e:
106
+ pass
107
+ try:
108
+ db.session.delete(docfile_ref.doc_file)
109
+ except Exception as e:
110
+ pass
111
+ # 不删除引用类
112
+ if not onlydel_doc_file:
113
+ db.session.delete(docfile_ref)
114
+ db.session.commit()
115
+ except Exception as e:
116
+ db.session.rollback()
117
+ current_app.logger.error(str(e))
118
+ raise
119
+
120
+ @staticmethod
121
+ def delete_file_name(save_file_name):
122
+ '''
123
+ 按文档路径删除文档
124
+ :param docClass:
125
+ :param docId:
126
+ :return:
127
+ '''
128
+ try:
129
+ os.remove(save_file_name)
130
+ except Exception as e:
131
+ pass
132
+
133
+ @staticmethod
134
+ def delete_file_masterid(docClass, docClass_masterid):
135
+ '''
136
+ 删除引用的所有附件文档(包括引用类和文档doc_file)
137
+ :param docClass:
138
+ :param docClass_masterid:
139
+ :return:
140
+ '''
141
+ docs = Doc_file.query.join(docClass,docClass.doc_fileid==Doc_file.id).filter(docClass.masterid == docClass_masterid).all()
142
+ for doc in docs:
143
+ docfile.delete_file_name(doc.save_file_name)
144
+ try:
145
+ # 先删除引用类,避免报引用错误
146
+ db.session.query(docClass).filter(docClass.masterid == docClass_masterid).delete(synchronize_session=False)
147
+ db.session.query(Doc_file).filter(Doc_file.id.in_([doc.id for doc in docs])).delete(
148
+ synchronize_session=False)
149
+ # db.session.query(Doc_file).filter(
150
+ # Doc_file.id.in_(db.session.query(Doc_file.id).join(docClass,docClass.doc_fileid==Doc_file.id).
151
+ # filter(docClass.masterid == docClass_masterid).subquery())
152
+ # ).delete(synchronize_session=False)
153
+ # db.session.delete(docs)
154
+ # db.session.commit()
155
+ # db.session.query(Doc_file).filter(docClass.doc_file.has(docClass.docClass_masterid==docClass_masterid)).delete(synchronize_session=False)
156
+ # 会报错误,改用
157
+ # db.session.query(Doc_file).join(docClass, docClass.doc_fileid == Doc_file.id).filter(docClass.docClass_masterid == docClass_masterid).delete(synchronize_session=False)
158
+ # db.session.query(docClass).filter(docClass.masterid == docClass_masterid).delete(synchronize_session=False)
159
+ # db.session.query(docClass).filter(docClass.docClass_masterid == docClass_masterid).delete()
160
+ except Exception as e:
161
+ db.session.rollback()
162
+ current_app.logger.error(str(e))
163
+
164
+ @staticmethod
165
+ def save_file2disk(docClass, file, docClass_id, filename=None, upload_folder=None, picsize=None, autocommit=True):
166
+ '''
167
+ 存file到磁盘,只保存doc_file记录到资料库
168
+ :param docClass: 文档的关联类,为空时不需要创建关联类
169
+ :param file: 文件流
170
+ :param docClass_id: 关联文档的id
171
+ :param filename: 文件的描述
172
+ :param upload_folder: 保存文件的目录
173
+ :param picsize: 文件的大小,超过时会被压缩,如:(1920, 1080)
174
+ :param exist_replace:文档存在则覆盖,当一对一的情况下,需要删除之前的文件
175
+ :return:
176
+ '''
177
+ if file is None:
178
+ return
179
+ try:
180
+ if upload_folder is None:
181
+ upload_folder = current_app.config['UPLOAD_FOLDER']
182
+ # 按表名来为目录来存储档案
183
+ file_path = os.path.join(upload_folder, docClass.__tablename__)
184
+ os.makedirs(file_path, exist_ok=True)
185
+ # 真实存储的文件增加秒数,防止被覆盖
186
+ file_name_dsk = get_file_name_dsk(file.filename, file_path)
187
+ # gif 不需要转格式,有设定压缩的才需要
188
+ if file.mimetype.startswith('image/') and file.mimetype!= 'image/gif' and picsize is not None:
189
+ pil_image = image_thumbnail(file.stream,picsize)
190
+ # pil_image = Image.open(file.stream)
191
+ # w, h = pil_image.size
192
+ # res_rate = get_rate(w, picsize[0], h, picsize[1])
193
+ # pil_image.thumbnail((round(w / res_rate), round(h / res_rate)))
194
+ file_name_dsk = file_name_dsk.rsplit('.',1)[0]+'.jpg'
195
+ pil_image.convert('RGB').save(file_name_dsk, 'jpeg')
196
+ else:
197
+ file.save(file_name_dsk)
198
+ doc_file = None
199
+ if docClass_id:
200
+ docfile_ref = docClass.query.filter(docClass.id == docClass_id).first()
201
+ if docfile_ref is None:
202
+ raise Exception(f'the data(class:{docClass.__tablename__},id:{docClass_id}) is not exist,')
203
+ doc_file = docfile_ref.doc_file
204
+ if doc_file:
205
+ file_name_old = doc_file.save_file_name
206
+ doc_file.save_file_name = file_name_dsk
207
+ docfile.delete_file_name(file_name_old)
208
+ if doc_file is None:
209
+ doc_file = Doc_file(file_name=file.filename if filename is None else filename,
210
+ file_size=round(os.path.getsize(file_name_dsk) / 1024, 2),
211
+ save_file_name=file_name_dsk,
212
+ # masterid=masterid,
213
+ upload_time=datetime.now(),
214
+ upload_user=g.current_user.uname,
215
+ type=docClass.__tablename__)
216
+ db.session.add(doc_file)
217
+ if autocommit:
218
+ db.session.commit()
219
+ return doc_file
220
+ except Exception as e:
221
+ db.session.rollback()
222
+ current_app.logger.error(str(e))
223
+ docfile.delete_file_name(file_name_dsk)
224
+ current_app.logger.error(str(e))
225
+ raise
226
+
227
+ @staticmethod
228
+ def insert_file(docClass, file, docClass_masterid, filename=None, upload_folder=None, picsize=(1920, 1080)):
229
+ '''
230
+ 存文档到磁盘,并保存记录到资料库
231
+ :param docClass: 文档的关联类,为空时不需要创建关联类
232
+ :param file: 文件流
233
+ :param docClass_masterid:
234
+ :param filename: 文件的描述
235
+ :param upload_folder: 保存文件的目录
236
+ :param picsize: 文件的大小,超过时会被压缩
237
+ :return:
238
+ '''
239
+ if file is None:
240
+ return
241
+ try:
242
+ docfile_ref = docClass(masterid=docClass_masterid)
243
+ docfile_ref.doc_file=docfile.save_file2disk(docClass, file, None, filename, upload_folder, picsize, autocommit=False)
244
+ db.session.add(docfile_ref)
245
+ db.session.add(docfile_ref.doc_file)
246
+ db.session.commit()
247
+ return docfile_ref
248
+ except Exception as e:
249
+ db.session.rollback()
250
+ current_app.logger.error(str(e))
251
+ raise
252
+
253
+ @classmethod
254
+ def getall_respon(cls, docClass, docClass_masterId, file_name=None, page=None, per_page=None):
255
+ '''
256
+ 获取所有文件的记录
257
+ :param docClass: 文档的boclass
258
+ :param docClass_masterId: 关联对象的masterid
259
+ :param file_name: 可按文件名做模糊查找
260
+ :param page:
261
+ :param per_page:
262
+ :return:
263
+ '''
264
+ datap = Doc_file.query.join(docClass,docClass.doc_fileid==Doc_file.id).filter(docClass.masterid == docClass_masterId)
265
+ if file_name:
266
+ datap = datap.filter(Doc_file.file_name.like('%'+file_name+'%'))
267
+ datas = datap.order_by(Doc_file.upload_time.desc()).paginate(page=page, per_page=per_page)
268
+ result = []
269
+ for data in datas.items:
270
+ tojson = data.to_json()
271
+ tojson['file_type'] = data.save_file_name.rsplit('.',1)[1]
272
+ result.append(set_timezone(tojson))
273
+ return result, 200, {"content-type": "chatset=utf8"}
274
+
275
+ @classmethod
276
+ def download_respon(cls, doc_file_id, save_file_name=None):
277
+ '''
278
+ 下载文档,如果知道文件存储路径,则直接输出
279
+ :param doc_file_id: doc_file.id
280
+ :param save_file_name: 文档存磁盘的path
281
+ :return:
282
+ '''
283
+ if save_file_name is None :
284
+ data = Doc_file.query.filter(Doc_file.id == doc_file_id).first_or_404()
285
+ save_file_name = data.save_file_name
286
+ file_name = data.file_name
287
+ else:
288
+ file_name = save_file_name.rsplit('.', 1)
289
+ rv = send_file(save_file_name, as_attachment=True)
290
+ # 中文名称用utf-8
291
+ filenames = {'filename': unicodedata.normalize('NFKD', file_name).encode('latin-1', 'ignore'),
292
+ 'filename*': "UTF-8''{}".format(urllib.parse.quote(file_name))}
293
+ rv.headers.set('Content-Disposition', 'attachment', **filenames)
294
+ return rv
295
+
296
+ @classmethod
297
+ def get_respon(cls, doc_file_Id, save_file_name=None):
298
+ '''
299
+ 获取文档流,如果知道文件存储路径,则直接输出
300
+ :param docClass:
301
+ :param doc_file_Id: 文档存资料库的ID
302
+ :param save_file_name: 文档存磁盘的path
303
+ :return:
304
+ '''
305
+ if save_file_name is None:
306
+ data = Doc_file.query.filter(Doc_file.id == doc_file_Id).first_or_404()
307
+ save_file_name = data.save_file_name
308
+ rv = send_file(save_file_name)
309
+ return rv
310
+
311
+ @classmethod
312
+ def delete_respon_by_docclass_id(cls, docClass, docClass_id):
313
+ '''
314
+ 删除引用关系和doc_file,同时移除硬盘中的文件
315
+ :param docClass: 引用关系类
316
+ :param docClass_id: 引用关系id
317
+ :return:
318
+ '''
319
+ try:
320
+ docfile.delete_file_doclassid(docClass, docClass_id)
321
+ except Exception as e:
322
+ db.session.rollback()
323
+ current_app.logger.error(str(e))
324
+ return {"error": str(e)}, 422, {"content-type": "chatset=utf8"}
325
+ return "", 204
326
+
327
+ @classmethod
328
+ def delete_respon_by_doc_fileid(cls, docClass, doc_fileid):
329
+ '''
330
+ 通过docClass 和doc_file_id来删除引用关系和doc_file,同时移除硬盘中的文件
331
+ *有多个文档时,用这个方法
332
+ :param docClass: 引用关系类
333
+ :param doc_fileid: 文档存资料库的ID
334
+ :return:
335
+ '''
336
+ try:
337
+ docclass =docClass.query.filter(docClass.doc_fileid==doc_fileid).first_or_404()
338
+ docfile.delete_file_doclassid(docClass, docclass.id)
339
+ except Exception as e:
340
+ db.session.rollback()
341
+ current_app.logger.error(str(e))
342
+ return {"error": str(e)}, 422, {"content-type": "chatset=utf8"}
343
+ return "", 204
344
+
345
+
346
+ @classmethod
347
+ def post_respon(cls, docClass, file, docClass_masterid, filename=None, upload_folder=None, picsize=(1920, 1080)):
348
+ '''
349
+ 上传
350
+ :param docClass:
351
+ :param file:
352
+ :param docClass_masterid:
353
+ :param filename: 文件的描述
354
+ :param upload_folder: 保存文件的目录
355
+ :param picsize: 文件的大小,超过时会被压缩
356
+ :return:
357
+ '''
358
+ try:
359
+ doc_class = docfile.insert_file(docClass, file, docClass_masterid, filename, upload_folder, picsize)
360
+ result = doc_class.to_json()
361
+ # 经过update 后,id 会变成 doc_file.id
362
+ result.update(doc_class.doc_file.to_json())
363
+ result['file_type'] = doc_class.doc_file.save_file_name.rsplit('.', 1)[1]
364
+ return set_timezone(result), \
365
+ 201, {"content-type": "chatset=utf8"}
366
+ except Exception as e:
367
+ db.session.rollback()
368
+ current_app.logger.error(str(e))
369
+ return {"error": str(e)}, 422, {"content-type": "chatset=utf8"}
370
+
371
+ @classmethod
372
+ def put_respon(cls, docClass, docClass_id, body):
373
+ '''
374
+ 修改文件的描述
375
+ :param docClass: 文档关联类
376
+ :param docClass_id:文档关联类id
377
+ :param body:
378
+ :return:
379
+ '''
380
+ try:
381
+ if 'file_name' in body.keys():
382
+ data = docClass.query.filter(docClass.id==docClass_id).first_or_404()
383
+ data.doc_file.file_name = body['file_name']
384
+ db.session.commit()
385
+ result = data.to_json()
386
+ # id 经过update 后,变为了doc_file.id
387
+ result.update(data.doc_file.to_json())
388
+ return set_timezone(result), 201, {"content-type": "charset=utf8"}
389
+ else:
390
+ raise Exception('不允许修改file_name之外的栏位,%s'%body)
391
+ except Exception as e:
392
+ db.session.rollback()
393
+ current_app.logger.error(str(e))
394
+ return {"error": str(e)}, 422, {"content-type": "charset=utf8"}
395
+
396
+
@@ -0,0 +1,33 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <xmi:XMI xmi:version="2.1" xmlns:uml="http://schema.omg.org/spec/UML/2.0" xmlns:xmi="http://schema.omg.org/spec/XMI/2.1">
3
+ <xmi:Documentation exporter="StarUML" exporterVersion="2.0"/>
4
+ <uml:Model xmi:id="AAAAAAFcnPi2+t+6c1I=" xmi:type="uml:Model" name="RootModel">
5
+ <packagedElement xmi:id="AAAAAAFcnKvRxd9Z09Q=" name="use case" visibility="public" xmi:type="uml:Model"/>
6
+ <packagedElement xmi:id="AAAAAAFX+txqBkS8DRI=" name="swagger" visibility="public" xmi:type="uml:Model">
7
+ <packagedElement xmi:id="AAAAAAFcnOshZ98GcSs=" name="sample" visibility="public" xmi:type="uml:Package">
8
+ <packagedElement xmi:id="AAAAAAFcnPccgd8nlM4=" name="sample" visibility="public" isAbstract="false" isFinalSpecialization="false" isLeaf="false" xmi:type="uml:Signal">
9
+ <ownedOperation xmi:id="AAAAAAFcnPc0Jd9Qfms=" name="sample" visibility="public" isStatic="false" isLeaf="false" concurrency="sequential" isQuery="false" isAbstract="false" xmi:type="uml:Operation">
10
+ <xmi:Extension extender="StarUML">
11
+ <stereotype value="get"/>
12
+ </xmi:Extension>
13
+ <ownedParameter xmi:id="AAAAAAFcnPhEit+0IEg=" name="in" visibility="public" isStatic="false" isLeaf="false" type="AAAAAAFcnPd8H99XZoo=" isReadOnly="false" isOrdered="false" isUnique="false" direction="in" xmi:type="uml:Parameter"/>
14
+ <ownedParameter xmi:id="AAAAAAFcnPhEi9+1Oac=" visibility="public" isStatic="false" isLeaf="false" type="AAAAAAFcnPfCCt+BF4c=" isReadOnly="false" isOrdered="false" isUnique="false" direction="return" xmi:type="uml:Parameter"/>
15
+ </ownedOperation>
16
+ </packagedElement>
17
+ <packagedElement xmi:id="AAAAAAFcnPd8H99XZoo=" name="g_s_i" visibility="public" isAbstract="false" isFinalSpecialization="false" isLeaf="false" xmi:type="uml:PrimitiveType"/>
18
+ <packagedElement xmi:id="AAAAAAFcnPfCCt+BF4c=" name="g_s_r" visibility="public" isAbstract="false" isFinalSpecialization="false" isLeaf="false" xmi:type="uml:PrimitiveType">
19
+ <ownedAttribute xmi:id="AAAAAAFcnPfaD9+sm0o=" name="default" visibility="public" isStatic="false" isLeaf="false" isReadOnly="false" isOrdered="false" isUnique="false" xmi:type="uml:Property" aggregation="none" isDerived="false" isID="false"/>
20
+ </packagedElement>
21
+ </packagedElement>
22
+ <xmi:Extension extender="StarUML">
23
+ <documentation value="swagger 定义"/>
24
+ <stereotype value="sample/v1.0"/>
25
+ </xmi:Extension>
26
+ </packagedElement>
27
+ <packagedElement xmi:id="AAAAAAFcnKhBF9pEd2k=" name="logic view" visibility="public" xmi:type="uml:Model">
28
+ <xmi:Extension extender="StarUML">
29
+ <documentation value="类图"/>
30
+ </xmi:Extension>
31
+ </packagedElement>
32
+ </uml:Model>
33
+ </xmi:XMI>
@@ -0,0 +1,14 @@
1
+ __pycache__
2
+ .idea
3
+ config.ini
4
+ *.pyc
5
+ *.sqlite
6
+ lib
7
+ *_backup
8
+ docker-compose.yaml
9
+ run.sh
10
+ uwsgi.ini
11
+ migrate_run.py
12
+ migrate_run.bat
13
+ migrate_run.sh
14
+ migrations
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env bash
2
+ set FLASK_APP=migrate_run.py
3
+ flask db init
4
+ flask db migrate
5
+ flask db upgrade
@@ -0,0 +1,9 @@
1
+ from flask import Flask
2
+ from flask_migrate import Migrate
3
+ from app.models import *
4
+
5
+ app = Flask(__name__)
6
+ app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///data-dev.sqlite'
7
+ db.init_app(app)
8
+ migrate = Migrate(app, db)
9
+
@@ -0,0 +1,17 @@
1
+ cython >= 0.29.13
2
+ mwutils>=0.1.36
3
+ mwpermission >= 0.1.26
4
+ mwsdk >= 0.2.14
5
+ python-consul==1.1.0
6
+ # 避免 非字母和数字的url参数需另外执行 decode的问题
7
+ yarl==1.4.2
8
+ Werkzeug>=0.15.5
9
+ Flask-Redis-Sentinel>=2.0.1
10
+ redis>=4.1.3
11
+ mwauth>=0.4.45
12
+ Flask-SQLAlchemy>=3.0.2
13
+ SQLAlchemy>=2.0.7
14
+ Flask>=2.2.2
15
+ connexion[swagger-ui]>=2.14.1
16
+ pymysql>=1.0.2
17
+
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env bash
2
+ # consul的host 格式 ip:port
3
+ export CONSUL_HTTP_ADDR=192.168.101.88:8500
4
+ # docker host的port
5
+ export WEB_PORT=8899
6
+ # true自動註冊到kong,true,false不做,注意字母全小寫
7
+ export KONG_AUTO_REGISTER=true
8
+ # true自動註冊成 consul服務,false不做,注意字母全小寫
9
+ export CONSUL_AUTO_REGISTER=true
10
+ # 资料库名,默认为 maxbus
11
+ export DATABASE_NAME=maxbus
12
+ # 权限用的系统名称
13
+ export SYSTEM_NAME=maxguide
14
+ # 權限第一層的ID
15
+ export SYSTEM_ID=maxguide000
16
+ export LOG_LEVEL=20
17
+ #export SWAGGER_HOST=192.168.101.88:8081
18
+ export UPLOAD_FOLDER="/var/文件共享目录"
19
+ # 认证方式 jwt,session,默认为jwt(不需要该设定,因auth已同时支持session和jwt)
20
+ # export AUTH_TYPE=jwt
21
+ # 開發環境的docker,代碼valume方式
22
+ # 设定session在redis中的保存时长,单位为秒,有设定值时,超过该值的时间没有用系统,session则失效,为0时按session有效时长等于登录的jwt有效时长
23
+ # export SESSION_EXPIRATION_TIME=0
24
+ docker-compose -f docker-compose-dev.yaml up -d
25
+ # 部署的docker-compose 文件
26
+ #docker-compose up -d
27
+
File without changes