From 079ee6f0f4a7cd8e4b77e56f9f1487b60d347671 Mon Sep 17 00:00:00 2001 From: floraachy <1622042529@qq.com> Date: Thu, 14 Nov 2024 14:27:06 +0800 Subject: [PATCH] update --- .gitignore | 2 + Dockerfile | 26 + README.md | 318 ++++++++- db.sqlite3 | 0 manage.py | 22 + maturityAnalyse/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 157 bytes .../__pycache__/settings.cpython-312.pyc | Bin 0 -> 2592 bytes .../__pycache__/urls.cpython-312.pyc | Bin 0 -> 1152 bytes .../__pycache__/views.cpython-312.pyc | Bin 0 -> 20187 bytes .../__pycache__/wsgi.cpython-312.pyc | Bin 0 -> 661 bytes maturityAnalyse/asgi.py | 16 + maturityAnalyse/settings.py | 124 ++++ maturityAnalyse/urls.py | 25 + maturityAnalyse/views.py | 611 ++++++++++++++++++ maturityAnalyse/wsgi.py | 16 + requirements.txt | Bin 0 -> 316 bytes static/config.ini | 28 + static/echar.js | 516 +++++++++++++++ 19 files changed, 1703 insertions(+), 1 deletion(-) create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 db.sqlite3 create mode 100644 manage.py create mode 100644 maturityAnalyse/__init__.py create mode 100644 maturityAnalyse/__pycache__/__init__.cpython-312.pyc create mode 100644 maturityAnalyse/__pycache__/settings.cpython-312.pyc create mode 100644 maturityAnalyse/__pycache__/urls.cpython-312.pyc create mode 100644 maturityAnalyse/__pycache__/views.cpython-312.pyc create mode 100644 maturityAnalyse/__pycache__/wsgi.cpython-312.pyc create mode 100644 maturityAnalyse/asgi.py create mode 100644 maturityAnalyse/settings.py create mode 100644 maturityAnalyse/urls.py create mode 100644 maturityAnalyse/views.py create mode 100644 maturityAnalyse/wsgi.py create mode 100644 requirements.txt create mode 100644 static/config.ini create mode 100644 static/echar.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0949605 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.venv/ +.idea/ \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..f0985f8 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,26 @@ +FROM python:3.12-slim +LABEL authors="lxy" + +# 设置工作目录 +WORKDIR /app + +# 复制依赖文件 +COPY requirements.txt . + +# 安装依赖 +RUN pip install --no-cache-dir -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt + +# 复制项目文件 +COPY . . + +# 设置环境变量 +ENV PYTHONUNBUFFERED=1 + +# 运行迁移(可选) +# RUN python manage.py migrate + +# 暴露端口 +EXPOSE 8080 + +# 启动 Django 开发服务器 +CMD ["python", "manage.py", "runserver", "0.0.0.0:8080"] \ No newline at end of file diff --git a/README.md b/README.md index f25c041..0228cc5 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,318 @@ -# Photoshop +# 开源项目评分标准说明文档 + +## 1. 概述 + +本评分系统旨在全面评估开源项目的质量、活跃度和成熟度。评分体系包含多个维度,每个维度都有其特定的评分标准和改进建议。 + +## 2. 评分维度 + +### 2.1 基础要素评分 + +## 开源许可证评分 + +- **满分标准**: 使用标准开源许可证(MIT/Apache/GPL等) - 100分 +- **不合格标准**: 无许可证 - 0分 +- **改进建议**: 建议使用标准的开源许可证以明确项目的使用条款和限制 + +### 2.2 问题处理评分 + +## 未解决issue评分 + +- **优秀**: 未解决issue较少 (80-100分) +- **良好**: 未解决issue较多 (60-80分) +- **待改进**: 未解决issue很多 (0-60分) +- **改进建议**: 保持适度的未解决issue数量,及时处理重要issue + +## 已解决issue评分 + +- **优秀**: 已解决issue很多 (80-100分) +- **良好**: 已解决issue较多 (60-80分) +- **待改进**: 已解决issue较少 (0-60分) +- **改进建议**: 提高issue解决率,保持良好的问题跟踪和处理机制 + +### 2.3 安全性评分 + +包含四个等级的安全警告评分: + +- 低风险安全警告 (100分/0分) +- 中等风险安全警告 (100分/0分) +- 高风险安全警告 (100分/0分) +- 严重风险安全警告 (100分/0分) + +每个等级的评分标准: + +- **满分标准**: 无相应级别警告 +- **不合格标准**: 存在多个相应级别警告 +- **改进建议**: 根据风险等级优先处理安全问题,确保项目安全性 + +### 2.4 社区活跃度评分 + +## Star数评分 + +- **优秀**: Star很多 (80-100分) +- **良好**: Star较多 (60-80分) +- **待改进**: Star较少 (0-60分) +- **改进建议**: 提高项目影响力,完善文档和功能以吸引更多用户关注 + +## 关注者评分 + +- **优秀**: 关注者很多 (80-100分) +- **良好**: 关注者较多 (60-80分) +- **待改进**: 关注者较少 (0-60分) +- **改进建议**: 增加项目曝光度,保持更新以维持用户关注度 + +## Fork数评分 + +- **优秀**: 分支数很多 (80-100分) +- **良好**: 分支数较多 (60-80分) +- **待改进**: 分支数较少 (0-60分) +- **改进建议**: 鼓励社区贡献,完善协作指南以促进分支开发 + +### 2.5 开发活跃度评分 + +## 提交次数评分 + +- **优秀**: 提交次数很多 (80-100分) +- **良好**: 提交次数较多 (60-80分) +- **待改进**: 提交次数较少 (0-60分) +- **改进建议**: 保持稳定的开发活跃度,定期提交代码更新 + +## 开发者数量评分 + +- **优秀**: 开发者数量很多 (80-100分) +- **良好**: 开发者数量较多 (60-80分) +- **待改进**: 开发者数量较少 (0-60分) +- **改进建议**: 扩大开发团队,培养核心贡献者 + +## 发布版本数评分 + +- **优秀**: 发布版本数很多 (80-100分) +- **良好**: 发布版本数较多 (60-80分) +- **待改进**: 发布版本数较少 (0-60分) +- **改进建议**: 建立规范的版本发布流程,保持稳定的迭代节奏 + +## 3. 总体成熟度评分 + +- **优秀**: 项目成熟,维护良好 (80-100分) +- **良好**: 项目稳定,有待改进 (60-80分) +- **一般**: 项目基本可用,需要加强维护 (40-60分) +- **待改进**: 项目初期或疏于维护 (0-40分) +- **改进建议**: 根据各项分值改进薄弱环节,提高项目整体质量 + +## 4. 评分使用建议 + +1. 定期进行评分,跟踪项目发展状况 +2. 针对低分项优先改进 +3. 关注安全警告,及时处理安全问题 +4. 持续完善文档和社区建设 +5. 保持稳定的更新和维护频率 + +## 5.接口文档 + +### 接口名称 + +项目成熟度分析接口 + +### 接口路径 + +``` +/maturityAnalyse/ +``` + +### 请求方法 + +``` +GET +``` + +### 请求参数 + +| 参数名 | 类型 | 是否必填 | 描述 | +| ---------- | ------ | -------- | ------------------ | +| owner | string | 是 | GitLink 仓库拥有者 | +| repository | string | 是 | GitLink 仓库名称 | + +### 示例请求 + +``` +bash + + +复制代码 +GET /maturityAnalyse/?owner=xuos&repository=xiuos +``` + +### 返回格式 + +返回数据为 JSON 格式,结构如下: + +``` +{ + "data": { + "scores": { + "license_score": { + "score": 100, + "description": "开源许可证评分", + "criteria": { + "100": "使用标准开源许可证(MIT/Apache/GPL等)", + "0": "无许可证" + }, + "suggestion": "建议使用标准的开源许可证以明确项目的使用条款和限制" + }, + "open_issue_score": { + "score": 1, + "description": "未解决issue评分", + "criteria": { + "80-100": "未解决issue较少", + "60-80": "未解决issue较多", + "0-60": "未解决issue很多" + }, + "suggestion": "保持适度的未解决issue数量,及时处理重要issue" + }, + "closed_issue_score": { + "score": 0, + "description": "已解决issue评分", + "criteria": { + "80-100": "已解决issue很多", + "60-80": "已解决issue较多", + "0-60": "已解决issue较少" + }, + "suggestion": "提高issue解决率,保持良好的问题跟踪和处理机制" + }, + "low_advisory_score": { + "score": 100, + "description": "低风险安全警告评分", + "criteria": { + "100": "无低风险警告", + "0": "多个低风险警告" + }, + "suggestion": "定期检查并修复安全隐患,即使是低风险问题也应重视" + }, + "moderate_advisory_score": { + "score": 100, + "description": "中等风险安全警告评分", + "criteria": { + "100": "无中等风险警告", + "0": "多个中风险警告" + }, + "suggestion": "优先处理中等风险安全问题,避免安全隐患扩大" + }, + "high_advisory_score": { + "score": 100, + "description": "高风险安全警告评分", + "criteria": { + "100": "无高风险警告", + "0": "多个高风险警告" + }, + "suggestion": "高风险安全问题必须立即处理,可考虑发布安全补丁版本" + }, + "critical_advisory_score": { + "score": 100, + "description": "严重风险安全警告评分", + "criteria": { + "100": "无严重风险警告", + "0": "多个严重风险警告" + }, + "suggestion": "严重安全问题需要紧急修复并及时通知用户更新" + }, + "stars_score": { + "score": 42, + "description": "项目Star数评分", + "criteria": { + "80-100": "Star很多", + "60-80": "Star较多", + "0-60": "Star较少" + }, + "suggestion": "提高项目影响力,完善文档和功能以吸引更多用户关注" + }, + "watching_score": { + "score": 100, + "description": "项目关注者评分", + "criteria": { + "80-100": "关注者很多", + "60-80": "关注者较多", + "0-60": "关注者较少" + }, + "suggestion": "增加项目曝光度,保持更新以维持用户关注度" + }, + "fork_score": { + "score": 53, + "description": "项目分支数评分", + "criteria": { + "80-100": "分支数很多", + "60-80": "分支数较多", + "0-60": "分支数较少" + }, + "suggestion": "鼓励社区贡献,完善协作指南以促进分支开发" + }, + "commits_number_score": { + "score": 100, + "description": "提交次数评分", + "criteria": { + "80-100": "提交次数很多", + "60-80": "提交次数较多", + "0-60": "提交次数较少" + }, + "suggestion": "保持稳定的开发活跃度,定期提交代码更新" + }, + "developer_number_score": { + "score": 100, + "description": "开发者数量评分", + "criteria": { + "80-100": "开发者数量很多", + "60-80": "开发者数量较多", + "0-60": "开发者数量较少" + }, + "suggestion": "扩大开发团队,培养核心贡献者" + }, + "release_number_score": { + "score": 100, + "description": "发布版本数评分", + "criteria": { + "80-100": "发布版本数很多", + "60-80": "发布版本数较多", + "0-60": "发布版本数较少" + }, + "suggestion": "建立规范的版本发布流程,保持稳定的迭代节奏" + }, + "overall_maturity_score": { + "score": 76.61538461538461, + "description": "总体成熟度评分", + "criteria": { + "80-100": "项目成熟,维护良好", + "60-80": "项目稳定,有待改进", + "40-60": "项目基本可用,需要加强维护", + "0-40": "项目初期或疏于维护" + }, + "suggestion": "根据各项分值改进薄弱环节,提高项目整体质量" + } + } + } +} +``` + +### 返回字段说明 + +- data + + : 返回的数据对象。 + + - scores + + : 各项评分的详细信息。 + + - **license_score**: 开源许可证评分。 + - **open_issue_score**: 未解决 issue 的评分。 + - **closed_issue_score**: 已解决 issue 的评分。 + - **low_advisory_score**: 低风险安全警告评分。 + - **moderate_advisory_score**: 中等风险安全警告评分。 + - **high_advisory_score**: 高风险安全警告评分。 + - **critical_advisory_score**: 严重风险安全警告评分。 + - **stars_score**: 项目 Star 数评分。 + - **watching_score**: 项目关注者评分。 + - **fork_score**: 项目分支数评分。 + - **commits_number_score**: 提交次数评分。 + - **developer_number_score**: 开发者数量评分。 + - **release_number_score**: 发布版本数评分。 + - **overall_maturity_score**: 总体成熟度评分。 diff --git a/db.sqlite3 b/db.sqlite3 new file mode 100644 index 0000000..e69de29 diff --git a/manage.py b/manage.py new file mode 100644 index 0000000..bbab9b9 --- /dev/null +++ b/manage.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + + +def main(): + """Run administrative tasks.""" + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'maturityAnalyse.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) + + +if __name__ == '__main__': + main() diff --git a/maturityAnalyse/__init__.py b/maturityAnalyse/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/maturityAnalyse/__pycache__/__init__.cpython-312.pyc b/maturityAnalyse/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cd804160eb46ddb411df99df596453d069e0d756 GIT binary patch literal 157 zcmX@j%ge<81a0~n=^*+sh(HIQS%4zb87dhx8U0o=6fpsLpFwJV*|=E61XPw} literal 0 HcmV?d00001 diff --git a/maturityAnalyse/__pycache__/settings.cpython-312.pyc b/maturityAnalyse/__pycache__/settings.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e7d497cf86b8e131751f19691f3dc852e18d2470 GIT binary patch literal 2592 zcmb7GOK;mo5GM70Tb7mBc>zp=#+F-CaS|tOkfxy}+7Tj4swl-N5tN{{Yne7hDty=# zPrCP#TXV>v$gSv4>BUA533xKlQ*UyD_K;JDlw=FCfx3c3?#|5j&Ft*Vu6~clBLsY& z|1#Gs#R=k1XEOW*27{0Pz~E;B5j=rNV_-Q;nL4mh1M($$k-iP+6^C2ZFeNGA2E0hBLc!PA zlEASf<1Zl&9N99Aw*DZSMQTH*`#y#dG}KlWD_J1S8fsf==-FZ5**?9og{e(bmMK}% z4NBcSS(vCGaD*j|+7)FJ>;K1>hBrqX{pIX(hO~VZ(b%$<2U(C59XCu3FKp~AndavF zH|DL!NRc5(ZRhj3`!{aik~-M>p@X-+?z9*8MDwmD+`qSUXBY3*Y;rymu+n`dx}hqD zCT-AeUahHdsR>T6j0qhGRt%%l#=12nL#9tFTA&b{fVe!4Fko*Q&W`ArptUg2 zwj_jPyeDdyc9#kjLUYcVVX$_rv+jy+8V3V&$eYw~YjFfPzKCI}M!{?S^o^kIov{d6YV2%_jUDI*`uU0` zws5)a6uv%!OOJINZECV^We02qZnb4-I(h?Wu!4q7LFe86s}0n;9UfZhcFL`Y9}NLI zrvY)Qnx64lbK{Jst!RWd%%(Me4oeNcgg!E?F9x>9b?YSg3}z?!)}1lq5+6~P?^%avN8T;i{cw zoTOBLDN6>vV?{tX7-u|ofGw>SO04ZGF>9;_*9c)f8C!r`Qf*P!_f!oDaJERubw}5A ztTBeu$)} zuqHK5Gx)KxVCuHFUdvfQxB;M(vevZ$Eo8E#A}s6lvebl5Q&%J`qf%zt4hjMs?t)+k z+i--+(uU@R)Y>6IaLyb@u3=r3cd;F4!*Qb+c4(R5SZBxW2*>8CY)yE|esBBp>~ek8 zjx)t#d7aG*Ps&`4vlE39R|63UpiDSBvR26Fi|jg6W$jqCT&@ZAYB5(Xt=QojyH+VO zHI}oJ>)dL=u`d>Kj8jo|IM37=$1P{iF!kCKp~7(7dbyexo-xG&D9ccY@gh@Ntuw2v zkSpg|AS|r00$+xb3DqIs!s1sYJK&6JJVagt=A7f*PUYDZre3TGz+4tq3T!d|EAi2} zSUx?>KX_5;7+b1R>EF9A#!iP*^Whyxw>zIg4NA$+K==?!+{#|tOAiCHM^%6v)N_Hc?01=LN{fCq3 zSN?ANLnN5;bQ2#^p@au?X(D;E8|#ILG)umpy!86%!Q||Ia_%raa~PvO5dIs9o;R3| z97W^)K+ii7_jJR(&xrKBeIg0`{>1wf{XRMK`r$!x_Q>x|f{ov`xlDv7_LF?i>j7NI zom56A-;GYH{mF&+RnI;#)4NGb&UE94vB_@uFgno<9YXklUW`agL%5LZ7{@2sY}(Dz7Y~A51PxUKEJ$UyccoFnsz>|3J)>6FmR2DnR-m)z zaQ-Z=qC>ri@^vOQgQ<7Zhf<3geZA8dHEavLkV)3V`*)#FNiXcD42h5u*rN=_NTe(j zqjiF!5yvoLbclW7Sk{99hC3;X5+np>gzvy8T@R;BGRYTc0P?=Ox$H>(G@faeeSAcS8mT;>-JL= zOBVO6jgQQMtHn!(M5nSJ+jw!%>D;BFo%`+?0P- zyBpEID-Eo6YN?5w+p=xzr#hFmmeo-ZheQU3a$G(eK8pM_LIUrZ`8RiOe&TGptX?cO zR739BRyNh`%Cpq%X0xSyS+!u{E>k~1)*P#e8EWSI1hHsJj?D}n3Y;0rfUG%oDBgk- zxfGmUzvXRjjl_VGt>PEio`C)Fu24=gI-OpLX^=+v20JG~n!Na`ydBjvO*_`-G~*Wp z+U0NH(hqR;*aY>)s|&A}54?TvU~PZxvvK9CG5x7=@y(<6%`e8vQN1>&KX0-*N%##D C&s>=R literal 0 HcmV?d00001 diff --git a/maturityAnalyse/__pycache__/views.cpython-312.pyc b/maturityAnalyse/__pycache__/views.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0a821514ad350a2b73881c919a85726b57f5fe52 GIT binary patch literal 20187 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 literal 0 HcmV?d00001 diff --git a/maturityAnalyse/__pycache__/wsgi.cpython-312.pyc b/maturityAnalyse/__pycache__/wsgi.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fb85a0b1ec421c373c86265cc12662c03cf26afa GIT binary patch literal 661 zcmZWnL2DC16rS0QP1)EWVvEN?JQ&d3_E3-_LLoJzYFbD|2!+jb=Vdctc4pa`q;7A$ z=uhw`i1ep;sVE40Q4tT`l-zo9)-<%#$1v}`d3^8t-eW#2EqTb=>)>Ae4kPrVOy*WO z52gn;c#9b7A%>YFa1UGW3MX-UE=GVyi*v|@AJs16dBiI0+KDsEFme#MC+DT!Lhdvc zj=p*?yR9~flpOGw3{*xEYQ`Bi`KF{I*Fe%tjUY0<=d}%iSEBWk#k{l4w@q-0YW5H2mT<+TN3j~Q}J23){> zq5-_2F{$1N0;VGEvk{fCnrn(w5`YZW{k34I4vh*Jq(bEhNE00Dm7q?LYjov^#Lx7Y5py5aMk=8I=rN4KwR!Pj66m$7bCi)t8JDPdSRN*6a~ zg8azN;g{_**Af<0kQ1IMS$G!6U_i&h6tzpt@6ohWcJ{EjvA>&}p_03^J?~#({x2^{ z{4_sXd^Fqk 0 else 0 + + if max_value > 2: + return log_generate_score(value, max_value, min_value) + else: + return normal_generate_score(value, max_value, min_value) + + +def normal_generate_score(value, max_value, min_value): + return int(100 * (value - min_value) / (max_value - min_value)) + + +def log_generate_score(value, max_value, min_value): + if max_value - min_value == 0 and max_value != 0: + return 50 + + fv = math.log10(value) if value > 0 else 0 + fmax = math.log10(max_value) if max_value != 0 else 0 + fmin = math.log10(min_value) if min_value != 0 else 0 + + return int(100 * (fv - fmin) / (fmax - fmin)) + + +def maturity(software, context): + ws = AllWeightSoftware(software) + + # 计算每个属性的分数 + ws.license_score = generate_score(software.license, context.license_max, context.license_min) + + ws.open_issue_score = generate_score(software.issue_opened, context.issue_opened_max, + context.issue_opened_min) + + ws.closed_issue_score = generate_score(software.issue_closed, context.issue_closed_max, context.issue_closed_min) + + ws.low_advisory_score = 100 - generate_score(software.low_advisory, context.low_advisory_max, + context.low_advisory_min) + + ws.moderate_advisory_score = 100 - generate_score(software.moderate_advisory, context.moderate_advisory_max, + context.moderate_advisory_min) + + ws.high_advisory_score = 100 - generate_score(software.high_advisory, context.high_advisory_max, + context.high_advisory_min) + + ws.critical_advisory_score = 100 - generate_score(software.critical_advisory, context.critical_advisory_max, + context.critical_advisory_min) + + ws.stars_score = generate_score(software.stars, context.stars_max, context.stars_min) + + ws.watching_score = generate_score(software.watching, context.watching_max, context.watching_min) + + ws.fork_score = generate_score(software.forks, context.forks_max, context.forks_min) + + ws.commits_number_score = generate_score(software.commits_number, context.commits_number_max, + context.commits_number_min) + + ws.developer_number_score = generate_score(software.developer_number, context.developer_number_max, + context.developer_number_min) + + ws.release_number_score = generate_score(software.release_number, context.release_number_max, + context.release_number_min) + + # 计算整体成熟度,去掉权重影响 + ws.m = (ws.license_score + ws.open_issue_score + ws.closed_issue_score + + # 降低了这部分内容的权重 + (ws.low_advisory_score + ws.moderate_advisory_score + ws.high_advisory_score + ws.critical_advisory_score) * 0.25 + + ws.stars_score + ws.watching_score + ws.fork_score + ws.commits_number_score + + ws.developer_number_score + ws.release_number_score) / 10 + + stage = 0 + if ws.m < 60: + stage = 2 + elif ws.m >= 60 and ws.m < 80: + stage = 1 + + yadd = stage * 3 - 1 + + scores_charts = [ + { + "name": "license_score", + "score": ws.license_score, + "description": "开源许可证评分", + "criteria": { + "100": "使用标准开源许可证(MIT/Apache/GPL等)", + "0": "无许可证" + }, + "suggestion": "建议使用标准的开源许可证以明确项目的使用条款和限制", + "itemStyle": { + "color": "#e9ff40" + }, + "value": [ + 3, + 1 + yadd, + ws.license_score + ] + }, + { + "name": "open_issue_score", + "score": ws.open_issue_score, + "description": "未解决issue评分", + "criteria": { + "80-100": "未解决issue较少", + "60-80": "未解决issue较多", + "0-60": "未解决issue很多" + }, + "suggestion": "保持适度的未解决issue数量,及时处理重要issue", + "itemStyle": { + "color": "#abd9e9" + }, + "value": [ + 7, + 2 + yadd, + ws.open_issue_score + ] + }, + { + "name": "closed_issue_score", + "score": ws.closed_issue_score, + "description": "已解决issue评分", + "criteria": { + "80-100": "已解决issue很多", + "60-80": "已解决issue较多", + "0-60": "已解决issue较少" + }, + "suggestion": "提高issue解决率,保持良好的问题跟踪和处理机制", + "itemStyle": { + "color": "#74add1" + }, + "value": [ + 8, + 2 + yadd, + ws.closed_issue_score + ] + }, + { + "name": "low_advisory_score", + "score": ws.low_advisory_score, + "description": "低风险安全警告评分", + "criteria": { + "100": "无低风险警告", + "0": "多个低风险警告" + }, + "suggestion": "定期检查并修复安全隐患,即使是低风险问题也应重视", + "itemStyle": { + "color": "#ffffbf" + }, + "value": [ + 0, + 1 + yadd, + ws.low_advisory_score + ] + }, + { + "name": "moderate_advisory_score", + "score": ws.moderate_advisory_score, + "description": "中等风险安全警告评分", + "criteria": { + "100": "无中等风险警告", + "0": "多个中风险警告" + }, + "suggestion": "优先处理中等风险安全问题,避免安全隐患扩大", + "itemStyle": { + "color": "#fee090" + }, + "value": [ + 0, + 2 + yadd, + ws.moderate_advisory_score + ] + }, + { + "name": "high_advisory_score", + "score": ws.high_advisory_score, + "description": "高风险安全警告评分", + "criteria": { + "100": "无高风险警告", + "0": "多个高风险警告" + }, + "suggestion": "高风险安全问题必须立即处理,可考虑发布安全补丁版本", + "itemStyle": { + "color": "#fdae61" + }, + "value": [ + 1, + 1 + yadd, + ws.high_advisory_score + ] + }, + { + "name": "critical_advisory_score", + "score": ws.critical_advisory_score, + "description": "严重风险安全警告评分", + "criteria": { + "100": "无严重风险警告", + "0": "多个严重风险警告" + }, + "suggestion": "严重安全问题需要紧急修复并及时通知用户更新", + "itemStyle": { + "color": "#f46d43" + }, + "value": [ + 1, + 2 + yadd, + ws.critical_advisory_score + ] + }, + { + "name": "stars_score", + "score": ws.stars_score, + "description": "项目Star数评分", + "criteria": { + "80-100": "Star很多", + "60-80": "Star较多", + "0-60": "Star较少" + }, + "suggestion": "提高项目影响力,完善文档和功能以吸引更多用户关注", + "itemStyle": { + "color": "#93AAFC" + }, + "value": [ + 3, + 2 + yadd, + ws.stars_score + ] + }, + { + "name": "watching_score", + "score": ws.watching_score, + "description": "项目关注者评分", + "criteria": { + "80-100": "关注者很多", + "60-80": "关注者较多", + "0-60": "关注者较少" + }, + "suggestion": "增加项目曝光度,保持更新以维持用户关注度", + "itemStyle": { + "color": "#40daff" + }, + "value": [ + 4, + 2 + yadd, + ws.watching_score + ] + }, + { + "name": "fork_score", + "score": ws.fork_score, + "description": "项目fork数评分", + "criteria": { + "80-100": "fork数很多", + "60-80": "fork数较多", + "0-60": "fork数较少" + }, + "suggestion": "鼓励社区贡献,完善协作指南以促进fork开发", + "itemStyle": { + "color": "#73d797" + }, + "value": [ + 5, + 1 + yadd, + ws.fork_score + ] + }, + { + "name": "commits_number_score", + "score": ws.commits_number_score, + "description": "提交次数评分", + "criteria": { + "80-100": "提交次数很多", + "60-80": "提交次数较多", + "0-60": "提交次数较少" + }, + "suggestion": "保持稳定的开发活跃度,定期提交代码更新", + "itemStyle": { + "color": "#ad73d7" + }, + "value": [ + 6, + 1 + yadd, + ws.commits_number_score + ] + }, + { + "name": "developer_number_score", + "score": ws.developer_number_score, + "description": "开发者数量评分", + "criteria": { + "80-100": "开发者数量很多", + "60-80": "开发者数量较多", + "0-60": "开发者数量较少" + }, + "suggestion": "扩大开发团队,培养核心贡献者", + "itemStyle": { + "color": "#ee6df5" + }, + "value": [ + 2, + 2 + yadd, + ws.developer_number_score + ] + }, + { + "name": "release_number_score", + "score": ws.release_number_score, + "description": "发布版本数评分", + "criteria": { + "80-100": "发布版本数很多", + "60-80": "发布版本数较多", + "0-60": "发布版本数较少" + }, + "suggestion": "建立规范的版本发布流程,保持稳定的迭代节奏", + "itemStyle": { + "color": "#c4b7e5" + }, + "value": [ + 2, + 1 + yadd, + ws.release_number_score + ] + }, + ] + + main_score = { + "name": "overall_maturity_score", + "score": ws.m, + "description": "总体成熟度评分", + "criteria": { + "80-100": "项目成熟,维护良好", + "60-80": "项目稳定,有待改进", + "40-60": "项目基本可用,需要加强维护", + "0-40": "项目初期或疏于维护" + }, + "x_axis": ["稳健性","稳健性","稳健性","扩展性","扩展性","扩展性","维护性","维护性","维护性"], + "y_axis": ["成熟型","成熟型","成熟型","稳定型","稳定型","稳定型","成长型","成长型","成长型"], + "suggestion": "根据各项分值改进薄弱环节,提高项目整体质量" + } + + return {'main_score': main_score, 'scores': scores_charts} + + +def fetch_data(url): + """从给定 URL 获取数据并以 JSON 格式返回。""" + response = requests.get(url) + response.raise_for_status() # 对于错误响应抛出异常 + return response.json() + + +@require_http_methods(['GET']) +def calculate(request): + owner = request.GET.get('owner') + repository = request.GET.get('repository') + env_url = "https://www.gitlink.org.cn" + if request.GET.get('env_url') == "testforgeplus": + env_url = "https://testforgeplus.trustie.net" + + # owner = "xuos" # 替换为实际的 owner + # repository = "xiuos" # 替换为实际的 repository + + # owner = "leslieder" + # repository = "nodom" + + # owner = "openEuler-Ecosystem" + # repository = "openEuler-EulerOS" + + # 从 API 获取数据 + link1_info = f"{env_url}/api/{owner}/{repository}/detail.json" + link2_contri = f"{env_url}/api/{owner}/{repository}/contributors.json" + link3_issue = f"{env_url}/api/{owner}/{repository}/issues.json" + link4_commits = f"{env_url}/api/{owner}/{repository}/commits.json" + link_release = f"{env_url}/api/{owner}/{repository}/releases.json" + + try: + software_detail = fetch_data(link1_info) + contributors = fetch_data(link2_contri) + issues = fetch_data(link3_issue) + commits = fetch_data(link4_commits) + releases = fetch_data(link_release) + + # 提取必要的信息 + license_info = 1 if software_detail.get("license_name") else 0 + issue_opened = issues.get("open_count", 0) + issue_closed = issues.get("close_count", 0) + low_advisory = software_detail.get("advisories", {}).get("low", 0) + moderate_advisory = software_detail.get("advisories", {}).get("moderate", 0) + high_advisory = software_detail.get("advisories", {}).get("high", 0) + critical_advisory = software_detail.get("advisories", {}).get("critical", 0) + stars = software_detail.get("praises_count", 0) + watching = software_detail.get("watchers_count", 0) + forks = software_detail.get("forked_count", 0) + commits_number = commits.get("total_count") + average_day_interval = software_detail.get("average_day_interval", 0) + readme = software_detail.get("readme", False) + contributing = software_detail.get("contributing", False) + developer_number = len(contributors.get("list")) + release_number = releases.get("total_count") + user_number = software_detail.get("user_number", 0) + sum_user_score = software_detail.get("sum_user_score", 0) + + except TypeError: + return JsonResponse({'data': {}}) + except: + return JsonResponse({'data': {}}) + # 输出每个信息 + # print("许可证:", license_info) + # print("打开的问题数量:", issue_opened) + # print("关闭的问题数量:", issue_closed) + # print("低风险通报数量:", low_advisory) + # print("中风险通报数量:", moderate_advisory) + # print("高风险通报数量:", high_advisory) + # print("严重风险通报数量:", critical_advisory) + # print("星级:", stars) + # print("关注者数量:", watching) + # print("分支数量:", forks) + # print("提交数量:", commits_number) + # print("平均天数间隔:", average_day_interval) + # print("是否包含 README:", readme) + # print("是否包含贡献指南:", contributing) + # print("开发者数量:", developer_number) + # print("发布版本数量:", release_number) + # print("用户数量:", user_number) + # print("用户总评分:", sum_user_score) + + # 创建 Software 实例 + software = Software( + license=license_info, + issue_opened=issue_opened, + issue_closed=issue_closed, + low_advisory=low_advisory, + moderate_advisory=moderate_advisory, + high_advisory=high_advisory, + critical_advisory=critical_advisory, + stars=stars, + watching=watching, + forks=forks, + commits_number=commits_number, + average_day_interval=average_day_interval, + readme=readme, + contributing=contributing, + developer_number=developer_number, + release_number=release_number, + user_number=user_number, + sum_user_score=sum_user_score + ) + + update_config(software) + + context = get_maturity_context() + maturity_score = maturity(software, context) + + return JsonResponse({'data': maturity_score}) + + +def update_config(software): + """根据软件数据更新 config.ini 文件""" + config = configparser.ConfigParser() + config.read(config_file_path) + + # 更新每个数据项 + update_config_value(config, 'license_info', software.license) + update_config_value(config, 'issue_opened', software.issue_opened) + update_config_value(config, 'issue_closed', software.issue_closed) + update_config_value(config, 'low_advisory', software.low_advisory) + update_config_value(config, 'moderate_advisory', software.moderate_advisory) + update_config_value(config, 'high_advisory', software.high_advisory) + update_config_value(config, 'critical_advisory', software.critical_advisory) + update_config_value(config, 'stars', software.stars) + update_config_value(config, 'watching', software.watching) + update_config_value(config, 'forks', software.forks) + update_config_value(config, 'commits_number', software.commits_number) + update_config_value(config, 'developer_number', software.developer_number) + update_config_value(config, 'release_number', software.release_number) + + # 保存更新后的配置 + with open(config_file_path, 'w') as configfile: + config.write(configfile) + + +def update_config_value(config, key, value): + """更新配置中的最大值和最小值""" + section = 'Limits' # 指定使用的节 + + # 获取当前最小值和最大值 + current_min = config.getint(section, key + '_min') + current_max = config.getint(section, key + '_max') + + # 更新最小值 + if value < current_min: + config.set(section, key + '_min', str(value)) + + # 更新最大值 + if value > current_max: + config.set(section, key + '_max', str(value)) + +# if __name__ == "__main__": +# owner = "xuos" # 替换为实际的 owner +# repository = "xiuos" # 替换为实际的 repository +# calculate(owner,repository) \ No newline at end of file diff --git a/maturityAnalyse/wsgi.py b/maturityAnalyse/wsgi.py new file mode 100644 index 0000000..6a03888 --- /dev/null +++ b/maturityAnalyse/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for maturityAnalyse project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/5.1/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'maturityAnalyse.settings') + +application = get_wsgi_application() diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..7fbddd430fe9925dca1705b97b6d900ab4151127 GIT binary patch literal 316 zcmYL^%MOAt5Jm6W#7~hRXyV45KY}8PK~P#Ye!P07EgCW;?cB%d=UvI^qE@5MYP9Do zm1)PUwbVir)edN0&=f8RP}3GI$+|PLCgxb?0njgQa_@YW6-g{NEMZ QC-}QSe "mock" === e.data.validity ? e.name + ": \u5373\u5c06\u4e0a\u7ebf" : e.data.description + ": " + e.data.value[2] + }, + visualMap: { + max: 20, + inRange: { + color: [ + '#313695', + '#4575b4', + '#74add1', + '#abd9e9', + '#e0f3f8', + '#ffffbf', + '#fee090', + '#fdae61', + '#f46d43', + '#d73027', + '#a50026' + ] + } + }, + xAxis3D: { + name: " ", + type: "category", + data: t, + interval: 2, + axisLine: { + lineStyle: { + width: 1, + color: l + } + }, + splitLine: { + show: !0, + interval: a - 1 + }, + axisLabel: { + interval: a - 1, + textStyle: { + color: r, + padding: [10, 10, 0, 0] + } + }, + axisTick: { + interval: a - 1, + length: 1 + } + }, + yAxis3D: { + name: " ", + type: "category", + data: i, + axisLine: { + lineStyle: { + width: 1, + color: l + } + }, + axisTick: { + interval: n - 1, + length: 0 + }, + splitArea: { + show: !0, + areaStyle: { + color: ["rgba(255,247,207,0.5)", "rgba(255,231,231,0.5)", "rgba(226,226,226,0.5)"] + } + }, + axisLabel: { + interval: n - 1, + textStyle: { + lineHeight: 2, + color: r, + padding: [10, 0, 0, 0] + } + }, + splitLine: { + show: !0, + interval: n - 1 + } + }, + zAxis3D: { + name: " ", + type: "value", + splitNumber: 4, + axisLine: { + lineStyle: o ? { + width: 1, + opacity: .2, + color: l + } : { + width: .1, + opacity: .5, + color: l + } + }, + splitArea: { + show: !0, + areaStyle: { + color: ["#ffffff", "#ffffff", "#ffffff"] + } + }, + axisLabel: { + show: !1 + }, + axisTick: { + show: !1 + } + }, + grid3D: { + axisLine: { + interval: 1 + }, + axisPointer: { + lineStyle: { + opacity: .2 + }, + label: { + show: !1 + } + }, + splitLine: { + interval: 2 + }, + viewControl: { + projection: "perspective", + zoomSensitivity: 0, + rotateSensitivity: [1, 0], + distance: 380, + alpha: 20, + beta: 25 + }, + top: -40, + boxWidth: 150, + boxDepth: 150, + environment: "none", + light: { + main: { + intensity: .8, + alpha: 50 + }, + ambient: { + intensity: .5 + } + } + }, + series: [{ + type: "bar3D", + data: e, + shading: "realistic", + bevelSize: .1, + bevelSmoothness: 2, + barSize: 10, + label: { + show: !1, + fontSize: 12, + fontWeight: 500, + borderWidth: 1, + color: "#333", + distance: -20, + formatter: function (e) { + for (var t = e.data.description, i = 2, a = Math.ceil(t.length / i), n = "\n", o = 0; o < a; o++) { + var l = o * i + , r = l + i; + n += t.substring(l, r) + "\n" + } + return n + } + }, + itemStyle: { + opacity: .95 + }, + emphasis: { + label: { + show: !1 + }, + itemStyle: { + color: "#FFB800", + opacity: .7 + } + } + }] +}; \ No newline at end of file