Compare commits

...

7 Commits

Author SHA1 Message Date
machuanyu 5a18eb5f7a Merge branch 'mcy'
# Conflicts:
#	lib/common/store/user_store.dart
#	lib/page/login_page/login_logic.dart
2024-04-08 15:24:43 +08:00
machuanyu f9ef3ec776 作业列表 2024-04-08 15:21:26 +08:00
machuanyu e73fb424a2 Merge branch 'master' into mcy 2024-04-07 09:25:48 +08:00
machuanyu a7df4d9fe8 Merge branch 'master' into mcy 2024-04-03 10:44:14 +08:00
machuanyu f228864bf6 -- 2024-04-03 10:08:09 +08:00
machuanyu 95ae5220a6 -- 2024-04-03 10:05:29 +08:00
machuanyu e13d11a248 -- 2024-04-03 10:05:02 +08:00
24 changed files with 3488 additions and 33 deletions

539
assets/icons/demo.css Normal file
View File

@ -0,0 +1,539 @@
/* Logo 字体 */
@font-face {
font-family: "iconfont logo";
src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');
src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');
}
.logo {
font-family: "iconfont logo";
font-size: 160px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
/* tabs */
.nav-tabs {
position: relative;
}
.nav-tabs .nav-more {
position: absolute;
right: 0;
bottom: 0;
height: 42px;
line-height: 42px;
color: #666;
}
#tabs {
border-bottom: 1px solid #eee;
}
#tabs li {
cursor: pointer;
width: 100px;
height: 40px;
line-height: 40px;
text-align: center;
font-size: 16px;
border-bottom: 2px solid transparent;
position: relative;
z-index: 1;
margin-bottom: -1px;
color: #666;
}
#tabs .active {
border-bottom-color: #f00;
color: #222;
}
.tab-container .content {
display: none;
}
/* 页面布局 */
.main {
padding: 30px 100px;
width: 960px;
margin: 0 auto;
}
.main .logo {
color: #333;
text-align: left;
margin-bottom: 30px;
line-height: 1;
height: 110px;
margin-top: -50px;
overflow: hidden;
*zoom: 1;
}
.main .logo a {
font-size: 160px;
color: #333;
}
.helps {
margin-top: 40px;
}
.helps pre {
padding: 20px;
margin: 10px 0;
border: solid 1px #e7e1cd;
background-color: #fffdef;
overflow: auto;
}
.icon_lists {
width: 100% !important;
overflow: hidden;
*zoom: 1;
}
.icon_lists li {
width: 100px;
margin-bottom: 10px;
margin-right: 20px;
text-align: center;
list-style: none !important;
cursor: default;
}
.icon_lists li .code-name {
line-height: 1.2;
}
.icon_lists .icon {
display: block;
height: 100px;
line-height: 100px;
font-size: 42px;
margin: 10px auto;
color: #333;
-webkit-transition: font-size 0.25s linear, width 0.25s linear;
-moz-transition: font-size 0.25s linear, width 0.25s linear;
transition: font-size 0.25s linear, width 0.25s linear;
}
.icon_lists .icon:hover {
font-size: 100px;
}
.icon_lists .svg-icon {
/* 通过设置 font-size 来改变图标大小 */
width: 1em;
/* 图标和文字相邻时,垂直对齐 */
vertical-align: -0.15em;
/* 通过设置 color 来改变 SVG 的颜色/fill */
fill: currentColor;
/* path stroke 溢出 viewBox 部分在 IE 下会显示
normalize.css 中也包含这行 */
overflow: hidden;
}
.icon_lists li .name,
.icon_lists li .code-name {
color: #666;
}
/* markdown 样式 */
.markdown {
color: #666;
font-size: 14px;
line-height: 1.8;
}
.highlight {
line-height: 1.5;
}
.markdown img {
vertical-align: middle;
max-width: 100%;
}
.markdown h1 {
color: #404040;
font-weight: 500;
line-height: 40px;
margin-bottom: 24px;
}
.markdown h2,
.markdown h3,
.markdown h4,
.markdown h5,
.markdown h6 {
color: #404040;
margin: 1.6em 0 0.6em 0;
font-weight: 500;
clear: both;
}
.markdown h1 {
font-size: 28px;
}
.markdown h2 {
font-size: 22px;
}
.markdown h3 {
font-size: 16px;
}
.markdown h4 {
font-size: 14px;
}
.markdown h5 {
font-size: 12px;
}
.markdown h6 {
font-size: 12px;
}
.markdown hr {
height: 1px;
border: 0;
background: #e9e9e9;
margin: 16px 0;
clear: both;
}
.markdown p {
margin: 1em 0;
}
.markdown>p,
.markdown>blockquote,
.markdown>.highlight,
.markdown>ol,
.markdown>ul {
width: 80%;
}
.markdown ul>li {
list-style: circle;
}
.markdown>ul li,
.markdown blockquote ul>li {
margin-left: 20px;
padding-left: 4px;
}
.markdown>ul li p,
.markdown>ol li p {
margin: 0.6em 0;
}
.markdown ol>li {
list-style: decimal;
}
.markdown>ol li,
.markdown blockquote ol>li {
margin-left: 20px;
padding-left: 4px;
}
.markdown code {
margin: 0 3px;
padding: 0 5px;
background: #eee;
border-radius: 3px;
}
.markdown strong,
.markdown b {
font-weight: 600;
}
.markdown>table {
border-collapse: collapse;
border-spacing: 0px;
empty-cells: show;
border: 1px solid #e9e9e9;
width: 95%;
margin-bottom: 24px;
}
.markdown>table th {
white-space: nowrap;
color: #333;
font-weight: 600;
}
.markdown>table th,
.markdown>table td {
border: 1px solid #e9e9e9;
padding: 8px 16px;
text-align: left;
}
.markdown>table th {
background: #F7F7F7;
}
.markdown blockquote {
font-size: 90%;
color: #999;
border-left: 4px solid #e9e9e9;
padding-left: 0.8em;
margin: 1em 0;
}
.markdown blockquote p {
margin: 0;
}
.markdown .anchor {
opacity: 0;
transition: opacity 0.3s ease;
margin-left: 8px;
}
.markdown .waiting {
color: #ccc;
}
.markdown h1:hover .anchor,
.markdown h2:hover .anchor,
.markdown h3:hover .anchor,
.markdown h4:hover .anchor,
.markdown h5:hover .anchor,
.markdown h6:hover .anchor {
opacity: 1;
display: inline-block;
}
.markdown>br,
.markdown>p>br {
clear: both;
}
.hljs {
display: block;
background: white;
padding: 0.5em;
color: #333333;
overflow-x: auto;
}
.hljs-comment,
.hljs-meta {
color: #969896;
}
.hljs-string,
.hljs-variable,
.hljs-template-variable,
.hljs-strong,
.hljs-emphasis,
.hljs-quote {
color: #df5000;
}
.hljs-keyword,
.hljs-selector-tag,
.hljs-type {
color: #a71d5d;
}
.hljs-literal,
.hljs-symbol,
.hljs-bullet,
.hljs-attribute {
color: #0086b3;
}
.hljs-section,
.hljs-name {
color: #63a35c;
}
.hljs-tag {
color: #333333;
}
.hljs-title,
.hljs-attr,
.hljs-selector-id,
.hljs-selector-class,
.hljs-selector-attr,
.hljs-selector-pseudo {
color: #795da3;
}
.hljs-addition {
color: #55a532;
background-color: #eaffea;
}
.hljs-deletion {
color: #bd2c00;
background-color: #ffecec;
}
.hljs-link {
text-decoration: underline;
}
/* 代码高亮 */
/* PrismJS 1.15.0
https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
/**
* prism.js default theme for JavaScript, CSS and HTML
* Based on dabblet (http://dabblet.com)
* @author Lea Verou
*/
code[class*="language-"],
pre[class*="language-"] {
color: black;
background: none;
text-shadow: 0 1px white;
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
text-align: left;
white-space: pre;
word-spacing: normal;
word-break: normal;
word-wrap: normal;
line-height: 1.5;
-moz-tab-size: 4;
-o-tab-size: 4;
tab-size: 4;
-webkit-hyphens: none;
-moz-hyphens: none;
-ms-hyphens: none;
hyphens: none;
}
pre[class*="language-"]::-moz-selection,
pre[class*="language-"] ::-moz-selection,
code[class*="language-"]::-moz-selection,
code[class*="language-"] ::-moz-selection {
text-shadow: none;
background: #b3d4fc;
}
pre[class*="language-"]::selection,
pre[class*="language-"] ::selection,
code[class*="language-"]::selection,
code[class*="language-"] ::selection {
text-shadow: none;
background: #b3d4fc;
}
@media print {
code[class*="language-"],
pre[class*="language-"] {
text-shadow: none;
}
}
/* Code blocks */
pre[class*="language-"] {
padding: 1em;
margin: .5em 0;
overflow: auto;
}
:not(pre)>code[class*="language-"],
pre[class*="language-"] {
background: #f5f2f0;
}
/* Inline code */
:not(pre)>code[class*="language-"] {
padding: .1em;
border-radius: .3em;
white-space: normal;
}
.token.comment,
.token.prolog,
.token.doctype,
.token.cdata {
color: slategray;
}
.token.punctuation {
color: #999;
}
.namespace {
opacity: .7;
}
.token.property,
.token.tag,
.token.boolean,
.token.number,
.token.constant,
.token.symbol,
.token.deleted {
color: #905;
}
.token.selector,
.token.attr-name,
.token.string,
.token.char,
.token.builtin,
.token.inserted {
color: #690;
}
.token.operator,
.token.entity,
.token.url,
.language-css .token.string,
.style .token.string {
color: #9a6e3a;
background: hsla(0, 0%, 100%, .5);
}
.token.atrule,
.token.attr-value,
.token.keyword {
color: #07a;
}
.token.function,
.token.class-name {
color: #DD4A68;
}
.token.regex,
.token.important,
.token.variable {
color: #e90;
}
.token.important,
.token.bold {
font-weight: bold;
}
.token.italic {
font-style: italic;
}
.token.entity {
cursor: help;
}

1499
assets/icons/demo_index.html Normal file

File diff suppressed because it is too large Load Diff

243
assets/icons/iconfont.css Normal file
View File

@ -0,0 +1,243 @@
@font-face {
font-family: "iconfont"; /* Project id 3423846 */
src: url('iconfont.woff2?t=1710142362036') format('woff2'),
url('iconfont.woff?t=1710142362036') format('woff'),
url('iconfont.ttf?t=1710142362036') format('truetype');
}
.iconfont {
font-family: "iconfont" !important;
font-size: 16px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.icon-Frame14:before {
content: "\e63e";
}
.icon-Frame13:before {
content: "\e63d";
}
.icon-Frame-113:before {
content: "\e63a";
}
.icon-Frame12:before {
content: "\e63b";
}
.icon-Frame-24:before {
content: "\e63c";
}
.icon-Frame10:before {
content: "\e639";
}
.icon-Frame9:before {
content: "\e635";
}
.icon-Frame-112:before {
content: "\e636";
}
.icon-Frame-33:before {
content: "\e637";
}
.icon-Frame-23:before {
content: "\e638";
}
.icon-Frame8:before {
content: "\e634";
}
.icon-Frame7:before {
content: "\e632";
}
.icon-Frame6:before {
content: "\e631";
}
.icon-yuejuanjilu:before {
content: "\e630";
}
.icon-Frame5:before {
content: "\e62e";
}
.icon-Frame11:before {
content: "\e62f";
}
.icon-a-1:before {
content: "\e629";
}
.icon-Frame4:before {
content: "\e627";
}
.icon-Frame-110:before {
content: "\e628";
}
.icon-Frame3:before {
content: "\e625";
}
.icon-Frame-19:before {
content: "\e626";
}
.icon-Frame2:before {
content: "\e61b";
}
.icon-Frame-18:before {
content: "\e61c";
}
.icon-Frame-22:before {
content: "\e61d";
}
.icon-Frame-32:before {
content: "\e61e";
}
.icon-Frame-42:before {
content: "\e61f";
}
.icon-Frame-51:before {
content: "\e620";
}
.icon-Frame-61:before {
content: "\e621";
}
.icon-Frame-71:before {
content: "\e622";
}
.icon-Frame-81:before {
content: "\e623";
}
.icon-Frame-91:before {
content: "\e624";
}
.icon-equal:before {
content: "\e61a";
}
.icon-warning:before {
content: "\e601";
}
.icon-error:before {
content: "\e602";
}
.icon-Frame-11:before {
content: "\e608";
}
.icon-Frame1:before {
content: "\e609";
}
.icon-Frame-21:before {
content: "\e60a";
}
.icon-Frame-31:before {
content: "\e60b";
}
.icon-Frame-41:before {
content: "\e60c";
}
.icon-Frame-9:before {
content: "\e60d";
}
.icon-Frame-8:before {
content: "\e60e";
}
.icon-Frame-13:before {
content: "\e60f";
}
.icon-Frame-12:before {
content: "\e610";
}
.icon-Frame-15:before {
content: "\e611";
}
.icon-Frame-17:before {
content: "\e612";
}
.icon-Frame-111:before {
content: "\e613";
}
.icon-Frame-16:before {
content: "\e614";
}
.icon-Frame-7:before {
content: "\e615";
}
.icon-Frame-14:before {
content: "\e616";
}
.icon-Frame-10:before {
content: "\e617";
}
.icon-Frame-5:before {
content: "\e618";
}
.icon-Frame-6:before {
content: "\e619";
}
.icon-Frame-2:before {
content: "\e603";
}
.icon-Frame-3:before {
content: "\e604";
}
.icon-Frame-1:before {
content: "\e605";
}
.icon-Frame:before {
content: "\e606";
}
.icon-Frame-4:before {
content: "\e607";
}

1
assets/icons/iconfont.js Normal file

File diff suppressed because one or more lines are too long

408
assets/icons/iconfont.json Normal file
View File

@ -0,0 +1,408 @@
{
"id": "3423846",
"name": "阅卷平台",
"font_family": "iconfont",
"css_prefix_text": "icon-",
"description": "",
"glyphs": [
{
"icon_id": "39483566",
"name": "Frame",
"font_class": "Frame14",
"unicode": "e63e",
"unicode_decimal": 58942
},
{
"icon_id": "39175701",
"name": "Frame",
"font_class": "Frame13",
"unicode": "e63d",
"unicode_decimal": 58941
},
{
"icon_id": "39173378",
"name": "Frame-1",
"font_class": "Frame-113",
"unicode": "e63a",
"unicode_decimal": 58938
},
{
"icon_id": "39173379",
"name": "Frame",
"font_class": "Frame12",
"unicode": "e63b",
"unicode_decimal": 58939
},
{
"icon_id": "39173377",
"name": "Frame-2",
"font_class": "Frame-24",
"unicode": "e63c",
"unicode_decimal": 58940
},
{
"icon_id": "39036939",
"name": "Frame",
"font_class": "Frame10",
"unicode": "e639",
"unicode_decimal": 58937
},
{
"icon_id": "38951584",
"name": "Frame",
"font_class": "Frame9",
"unicode": "e635",
"unicode_decimal": 58933
},
{
"icon_id": "38951583",
"name": "Frame-1",
"font_class": "Frame-112",
"unicode": "e636",
"unicode_decimal": 58934
},
{
"icon_id": "38951582",
"name": "Frame-3",
"font_class": "Frame-33",
"unicode": "e637",
"unicode_decimal": 58935
},
{
"icon_id": "38951581",
"name": "Frame-2",
"font_class": "Frame-23",
"unicode": "e638",
"unicode_decimal": 58936
},
{
"icon_id": "38561727",
"name": "Frame",
"font_class": "Frame8",
"unicode": "e634",
"unicode_decimal": 58932
},
{
"icon_id": "38318831",
"name": "继续阅卷",
"font_class": "Frame7",
"unicode": "e632",
"unicode_decimal": 58930
},
{
"icon_id": "38307813",
"name": "Frame",
"font_class": "Frame6",
"unicode": "e631",
"unicode_decimal": 58929
},
{
"icon_id": "38304788",
"name": "阅卷记录",
"font_class": "yuejuanjilu",
"unicode": "e630",
"unicode_decimal": 58928
},
{
"icon_id": "38108247",
"name": "Frame",
"font_class": "Frame5",
"unicode": "e62e",
"unicode_decimal": 58926
},
{
"icon_id": "38108264",
"name": "Frame1",
"font_class": "Frame11",
"unicode": "e62f",
"unicode_decimal": 58927
},
{
"icon_id": "36030549",
"name": "1",
"font_class": "a-1",
"unicode": "e629",
"unicode_decimal": 58921
},
{
"icon_id": "36025847",
"name": "Frame",
"font_class": "Frame4",
"unicode": "e627",
"unicode_decimal": 58919
},
{
"icon_id": "36025848",
"name": "Frame-1",
"font_class": "Frame-110",
"unicode": "e628",
"unicode_decimal": 58920
},
{
"icon_id": "35726114",
"name": "Frame",
"font_class": "Frame3",
"unicode": "e625",
"unicode_decimal": 58917
},
{
"icon_id": "35726115",
"name": "Frame-1",
"font_class": "Frame-19",
"unicode": "e626",
"unicode_decimal": 58918
},
{
"icon_id": "35408271",
"name": "Frame",
"font_class": "Frame2",
"unicode": "e61b",
"unicode_decimal": 58907
},
{
"icon_id": "35408272",
"name": "Frame-1",
"font_class": "Frame-18",
"unicode": "e61c",
"unicode_decimal": 58908
},
{
"icon_id": "35408273",
"name": "Frame-2",
"font_class": "Frame-22",
"unicode": "e61d",
"unicode_decimal": 58909
},
{
"icon_id": "35408283",
"name": "Frame-3",
"font_class": "Frame-32",
"unicode": "e61e",
"unicode_decimal": 58910
},
{
"icon_id": "35408284",
"name": "Frame-4",
"font_class": "Frame-42",
"unicode": "e61f",
"unicode_decimal": 58911
},
{
"icon_id": "35408288",
"name": "Frame-5",
"font_class": "Frame-51",
"unicode": "e620",
"unicode_decimal": 58912
},
{
"icon_id": "35408289",
"name": "Frame-6",
"font_class": "Frame-61",
"unicode": "e621",
"unicode_decimal": 58913
},
{
"icon_id": "35408298",
"name": "Frame-7",
"font_class": "Frame-71",
"unicode": "e622",
"unicode_decimal": 58914
},
{
"icon_id": "35408300",
"name": "Frame-8",
"font_class": "Frame-81",
"unicode": "e623",
"unicode_decimal": 58915
},
{
"icon_id": "35408317",
"name": "Frame-9",
"font_class": "Frame-91",
"unicode": "e624",
"unicode_decimal": 58916
},
{
"icon_id": "30190804",
"name": "equal",
"font_class": "equal",
"unicode": "e61a",
"unicode_decimal": 58906
},
{
"icon_id": "30183282",
"name": "warning",
"font_class": "warning",
"unicode": "e601",
"unicode_decimal": 58881
},
{
"icon_id": "30183283",
"name": "error",
"font_class": "error",
"unicode": "e602",
"unicode_decimal": 58882
},
{
"icon_id": "29930405",
"name": "Frame-1",
"font_class": "Frame-11",
"unicode": "e608",
"unicode_decimal": 58888
},
{
"icon_id": "29930406",
"name": "Frame",
"font_class": "Frame1",
"unicode": "e609",
"unicode_decimal": 58889
},
{
"icon_id": "29930407",
"name": "Frame-2",
"font_class": "Frame-21",
"unicode": "e60a",
"unicode_decimal": 58890
},
{
"icon_id": "29930408",
"name": "Frame-3",
"font_class": "Frame-31",
"unicode": "e60b",
"unicode_decimal": 58891
},
{
"icon_id": "29930409",
"name": "Frame-4",
"font_class": "Frame-41",
"unicode": "e60c",
"unicode_decimal": 58892
},
{
"icon_id": "29930410",
"name": "Frame-9",
"font_class": "Frame-9",
"unicode": "e60d",
"unicode_decimal": 58893
},
{
"icon_id": "29930411",
"name": "Frame-8",
"font_class": "Frame-8",
"unicode": "e60e",
"unicode_decimal": 58894
},
{
"icon_id": "29930412",
"name": "Frame-13",
"font_class": "Frame-13",
"unicode": "e60f",
"unicode_decimal": 58895
},
{
"icon_id": "29930413",
"name": "Frame-12",
"font_class": "Frame-12",
"unicode": "e610",
"unicode_decimal": 58896
},
{
"icon_id": "29930414",
"name": "Frame-15",
"font_class": "Frame-15",
"unicode": "e611",
"unicode_decimal": 58897
},
{
"icon_id": "29930415",
"name": "Frame-17",
"font_class": "Frame-17",
"unicode": "e612",
"unicode_decimal": 58898
},
{
"icon_id": "29930416",
"name": "Frame-11",
"font_class": "Frame-111",
"unicode": "e613",
"unicode_decimal": 58899
},
{
"icon_id": "29930417",
"name": "Frame-16",
"font_class": "Frame-16",
"unicode": "e614",
"unicode_decimal": 58900
},
{
"icon_id": "29930418",
"name": "Frame-7",
"font_class": "Frame-7",
"unicode": "e615",
"unicode_decimal": 58901
},
{
"icon_id": "29930419",
"name": "Frame-14",
"font_class": "Frame-14",
"unicode": "e616",
"unicode_decimal": 58902
},
{
"icon_id": "29930420",
"name": "Frame-10",
"font_class": "Frame-10",
"unicode": "e617",
"unicode_decimal": 58903
},
{
"icon_id": "29930421",
"name": "Frame-5",
"font_class": "Frame-5",
"unicode": "e618",
"unicode_decimal": 58904
},
{
"icon_id": "29930422",
"name": "Frame-6",
"font_class": "Frame-6",
"unicode": "e619",
"unicode_decimal": 58905
},
{
"icon_id": "29929656",
"name": "Frame-2",
"font_class": "Frame-2",
"unicode": "e603",
"unicode_decimal": 58883
},
{
"icon_id": "29929657",
"name": "Frame-3",
"font_class": "Frame-3",
"unicode": "e604",
"unicode_decimal": 58884
},
{
"icon_id": "29929658",
"name": "Frame-1",
"font_class": "Frame-1",
"unicode": "e605",
"unicode_decimal": 58885
},
{
"icon_id": "29929659",
"name": "Frame",
"font_class": "Frame",
"unicode": "e606",
"unicode_decimal": 58886
},
{
"icon_id": "29929660",
"name": "Frame-4",
"font_class": "Frame-4",
"unicode": "e607",
"unicode_decimal": 58887
}
]
}

BIN
assets/icons/iconfont.ttf Normal file

Binary file not shown.

BIN
assets/icons/iconfont.woff Normal file

Binary file not shown.

BIN
assets/icons/iconfont.woff2 Normal file

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

View File

@ -1,5 +1,6 @@
import 'package:dio/dio.dart' hide Headers;
import 'package:retrofit/retrofit.dart';
import 'package:school_asignment_app/common/job/enum_subject.dart';
import 'package:school_asignment_app/common/job/user_info_detail.dart';
import 'package:school_asignment_app/common/job/work_student.dart';
import 'package:school_asignment_app/common/job/work_student_params.dart';
@ -19,4 +20,7 @@ abstract class RetrofitClient {
@GET("/api/hms/Homework/GetList")
Future<WorkStudent> getWorkList(@Queries() WorkStudentParams params);
@GET("/api/app/Common/GetEnumInfos")
Future<Map<String,List<EnumSubject>>> getEnumSubjectList(@Query('enumNames') String enumNames);
}

View File

@ -0,0 +1,23 @@
import 'package:json_annotation/json_annotation.dart';
part 'enum_subject.g.dart';
@JsonSerializable()
class EnumSubject extends Object {
@JsonKey(name: 'id')
int id;
@JsonKey(name: 'name')
String name;
EnumSubject(this.id,this.name,);
factory EnumSubject.fromJson(Map<String, dynamic> srcJson) => _$EnumSubjectFromJson(srcJson);
Map<String, dynamic> toJson() => _$EnumSubjectToJson(this);
}

View File

@ -49,7 +49,7 @@ class Items extends Object {
int collectRate;
@JsonKey(name: 'annotateRate')
int annotateRate;
double annotateRate;
@JsonKey(name: 'classes')
List<Classes> classes;
@ -60,7 +60,11 @@ class Items extends Object {
@JsonKey(name: 'creationTime')
String creationTime;
Items(this.id,this.assessType,this.name,this.grade,this.subject,this.publishTime,this.state,this.collectRate,this.annotateRate,this.classes,this.creatorName,this.creationTime,);
@JsonKey(name: 'classCount')
int? classCount;
Items(this.id,this.assessType,this.name,this.grade,this.subject,this.publishTime,this.state,this.collectRate,this.annotateRate,this.classes,this.creatorName,this.creationTime,this.classCount);
factory Items.fromJson(Map<String, dynamic> srcJson) => _$ItemsFromJson(srcJson);
@ -85,7 +89,7 @@ class Classes extends Object {
String className;
@JsonKey(name: 'finishTime')
String finishTime;
String? finishTime;
Classes(this.schoolId,this.schoolName,this.classId,this.className,this.finishTime,);

View File

@ -29,7 +29,6 @@ class RequestTool {
return RetrofitClient(dio, baseUrl: RequestConfig().baseUrl);
}
final RetrofitClient _client;
static RequestTool? _instance;

View File

@ -1,11 +1,13 @@
import 'package:get/get.dart';
import 'package:school_asignment_app/common/job/enum_subject.dart';
import 'package:school_asignment_app/common/job/user_info.dart';
import 'package:school_asignment_app/common/job/user_info_detail.dart';
import 'package:school_asignment_app/common/mixins/request_tool_mixin.dart';
import 'package:school_asignment_app/common/utils/storage.dart';
import 'package:school_asignment_app/common/store/app_storage_key.dart';
import 'package:school_asignment_app/routes/app_pages.dart';
class UserStore extends GetxController {
class UserStore extends GetxController with RequestToolMixin{
static UserStore get to => Get.find();
///
@ -18,6 +20,8 @@ class UserStore extends GetxController {
///
Rx<UserInfoDetail?> userDetailInfo = Rx(null);
RxList<EnumSubject> subjectList = RxList();
UserStore init() {
token = StorageService.to.read(AppStorageKey.token.value);
xToken = StorageService.to.read(AppStorageKey.xToken.value);
@ -65,4 +69,10 @@ class UserStore extends GetxController {
token = null;
xToken = null;
}
//
getSubjectList() async {
var res = await getClient().getEnumSubjectList('EnumSubject');
subjectList.value = res['EnumSubject']!;
}
}

View File

@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
class Utils{
@ -14,4 +15,25 @@ class Utils{
FocusManager.instance.primaryFocus?.unfocus();
}
}
//
static bool isPad([double mobilePhoneScale = 1.2]) {
return ScreenUtil().scaleWidth > mobilePhoneScale;
}
static String getDoubleRemoveZero(double? val, [String? defaultVal]) {
try {
if (val == null) throw Exception('数据为空');
List<String> _valArr = val.toString().split('.');
if (_valArr.length >= 2) {
if (int.parse(_valArr[1]) == 0) {
return val.toInt().toString();
}
return val.toString();
}
return val.toInt().toString();
} catch (e) {
return defaultVal ?? '';
}
}
}

View File

@ -38,6 +38,7 @@ class MyApp extends StatelessWidget {
theme: ThemeData(
brightness: Brightness.light,
primarySwatch: createMaterialColor(const Color.fromRGBO(46, 91, 255, 1)),
primaryColor: const Color.fromRGBO(46, 91, 255, 1),
// textTheme: Typography.englishLike2018.apply(fontSizeFactor: 1.sp,),
primaryTextTheme: TextTheme(
bodyLarge: TextStyle(fontSize: 14.sp, color: Colors.black87),

View File

@ -0,0 +1,60 @@
/*
* @Descripttion:
* @version:
* @Author: wy
* @Date: 2020-07-01 15:45:15
* @LastEditors: wangyang 1147192855@qq.com
* @LastEditTime: 2022-07-19 11:14:07
*/
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
class MyEmptyWidget extends StatelessWidget {
static const String defText = "抱歉,暂无内容";
static const String defimg = "assets/images/not_data_bgm2.png";
final String? textVal;
final String? imgAssetPath;
final AlignmentGeometry alignment;
final EdgeInsets? padding;
final double? imgWidth;
final double? imgHeight;
const MyEmptyWidget(
{this.imgWidth,
this.imgHeight,
this.textVal,
this.padding,
this.imgAssetPath,
this.alignment = Alignment.center,
Key? key})
: super(key: key);
@override
Widget build(BuildContext context) {
return Container(
padding: padding ?? EdgeInsets.only(bottom: 40.r),
alignment: alignment,
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Opacity(
opacity: 0.6,
child: Image.asset(
imgAssetPath ?? defimg,
fit: BoxFit.cover,
width: imgWidth ?? 150.w,
height: imgHeight ?? 150.w,
),
),
Padding(
padding: EdgeInsets.only(top: 5.h),
child: Text(
textVal ?? defText,
style: TextStyle(fontSize: 12.sp, color: const Color(0xB2898B8D)),
),
)
],
),
);
}
}

View File

@ -1,37 +1,142 @@
import 'package:flutter/material.dart';
import 'package:flutter_easyrefresh/easy_refresh.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';
import 'package:school_asignment_app/common/job/enum_subject.dart';
import 'package:school_asignment_app/common/job/work_student.dart';
import 'package:school_asignment_app/common/job/work_student_params.dart';
import 'package:school_asignment_app/common/mixins/request_tool_mixin.dart';
import 'package:school_asignment_app/common/store/user_store.dart';
import 'package:school_asignment_app/common/utils/toast_utils.dart';
import 'package:school_asignment_app/page/global_widget/my_text.dart';
import 'home_state.dart';
class HomeLogic extends GetxController with RequestToolMixin,GetTickerProviderStateMixin{
final HomeState state = HomeState();
late TabController tabController;
/* 待阅卷 */
late final EasyRefreshController refreshController1;
late final EasyRefreshController refreshController2;
@override
void onInit(){
super.onInit();
state.userInfo = UserStore.to.userInfo;
state.active = Get.arguments ?? 1;
refreshController1 = EasyRefreshController();
refreshController2 = EasyRefreshController();
tabController = TabController(
length: 2,
vsync: this,
);
print('state.active=${state.active}');
getList();
}
void getList() async{
WorkStudentParams params = WorkStudentParams(assessType: 0,);
WorkStudentParams params = WorkStudentParams(assessType: state.tabIndex.value,);
WorkStudent data = await getClient().getWorkList(params);
state.workList.value = data.items;
refreshController1.finishRefresh();
refreshController2.finishRefresh();
print('state.workList.length=');
print(state.workList.length);
}
///
Future<void> onMyRefresh(EasyRefreshController controller, int tab) async {
/* params.page = RequestConfig.basePage.page;
List<JobTaskItem> lists = await getData(controller, params, isReFresh: true);
try {
tab == 1 ? (markingDatas1 = lists) : (markingDatas2 = lists);
} catch (e) {}
toUpState(setState, () {}, mounted);*/
getList();
}
///
Future<void> onMyLoad(EasyRefreshController controller, int tab) async {
/*params.page++;
List<JobTaskItem> lists = await getData(controller, params);
if (lists.isNotEmpty) {
tab == 1 ? markingDatas1.addAll(lists) : markingDatas2.addAll(lists);
toUpState(setState, () {}, mounted);
}*/
}
String formatSubject(int id){
if(UserStore.to.subjectList.isEmpty){
return '';
}
EnumSubject item = UserStore.to.subjectList.firstWhere((element) => element.id == id);
return item.name??'';
}
/* Future<void> showStudents(
BuildContext context, [
bool? submitted = false,
String? className,
]) async {
ToastUtils.showLoading();
List<JobConcernedWithStudent> students = [];
showModalBottomSheet(
context: context,
elevation: 10,
backgroundColor: Colors.white,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(20.r),
topRight: Radius.circular(20.r),
),
),
builder: (BuildContext context) {
return Padding(
padding: EdgeInsets.symmetric(horizontal: 2.w),
child: Column(
children: [
Container(
margin: EdgeInsets.only(top: 14.h),
child: quickText(
'${className ?? ''}${submitted! ? '已提交' : '未提交'}作业学生',
size: 18.sp,
fontWeight: FontWeight.bold,
color: Color.fromRGBO(60, 60, 60, 1),
),
),
Expanded(
child: ListView(
padding: EdgeInsets.symmetric(vertical: 8.h, horizontal: 4.w),
children: [
Wrap(
spacing: 6.0, // ()
runSpacing: 4.0, //
alignment: WrapAlignment.spaceAround, //沿
children: students.map((e) {
return Chip(
backgroundColor: Color.fromRGBO(239, 242, 255, 1),
avatar: CircleAvatar(
backgroundColor: Colors.white,
child: quickText(e.studentName.substring(0, 1),
size: 12.sp, color: Theme.of(context).primaryColor),
),
label: quickText(e.studentName, color: Color.fromRGBO(80, 94, 110, 1), size: 12.sp),
);
}).toList(),
),
],
),
)
],
),
);
},
);
}*/
@override
void dispose(){
super.dispose();
tabController.dispose();
refreshController1.dispose();
refreshController2.dispose();
}
}

View File

@ -1,6 +1,9 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:school_asignment_app/common/job/enum_subject.dart';
import 'package:school_asignment_app/common/job/user_info.dart';
import 'package:school_asignment_app/common/job/work_student.dart';
import 'package:school_asignment_app/common/store/user_store.dart';
class HomeState {
HomeState() {
@ -9,7 +12,7 @@ class HomeState {
late Rx<UserInfo?> userInfo;
int active = 1;
late RxList workList = RxList();
late RxList<Items> workList = RxList();
late RxInt tabIndex = 0.obs;
late bool completedToRefresh = true;
}

View File

@ -1,12 +1,18 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_easyrefresh/easy_refresh.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:functional_widget_annotation/functional_widget_annotation.dart';
import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';
import 'package:school_asignment_app/common/job/work_student.dart';
import 'package:school_asignment_app/common/store/app_storage_key.dart';
import 'package:school_asignment_app/common/utils/storage.dart';
import 'package:school_asignment_app/common/utils/utils.dart';
import 'package:school_asignment_app/page/global_widget/MyEmptyWidget.dart';
import 'package:school_asignment_app/page/global_widget/global_scaffold.dart';
import 'package:school_asignment_app/page/global_widget/my_text.dart';
import 'package:school_asignment_app/page/home_page/widget/task_list_item.dart';
import 'package:school_asignment_app/page/home_page/widget/top_user_info.dart';
import 'package:school_asignment_app/routes/app_pages.dart';
@ -54,7 +60,7 @@ class _HomePageState extends State<HomePage> {
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Expanded(flex: 1, child: SizedBox()),
const Expanded(flex: 1, child: SizedBox()),
Expanded(
flex: 4,
child: Container(
@ -88,6 +94,7 @@ class _HomePageState extends State<HomePage> {
// _refreshController2.callRefresh();
state.completedToRefresh = false;
}
logic.getList();
},
tabs: <Widget>[
Tab(
@ -167,15 +174,16 @@ class _HomePageState extends State<HomePage> {
transition: getTransition());*/
},
child: Icon(
IconData(0xe63e, fontFamily: "AlibabaIcon"),
color: Color.fromRGBO(44, 48, 63, 1),
const IconData(
0xe63e, fontFamily: "AlibabaIcon"),
color: const Color.fromRGBO(44, 48, 63, 1),
size: 24.sp),
),
),
],
),
),
/* if (state.tabIndex.value == 1)
/* if (state.tabIndex.value == 1)
$CompletedJobConditionFilter(
controller: _tabController2,
jobType: params2.markingType ?? 1,
@ -202,31 +210,32 @@ class _HomePageState extends State<HomePage> {
_refreshController2.callRefresh();
},
),*/
/* Expanded(
child: Obx(() {
return IndexedStack(
Expanded(
child: IndexedStack(
index: state.tabIndex.value,
children: <Widget>[
$EasyRefresh(
controller: _refreshController1,
params: params1,
$easyRefresh(
controller: logic.refreshController1,
tab: 1,
data: markingDatas1,
onLoad: onMyLoad,
onRefresh: onMyRefresh,
type: state.active,
data: state.workList,
onLoad: logic.onMyLoad,
onRefresh: logic.onMyRefresh,
logic: logic
),
$EasyRefresh(
controller: _refreshController2,
params: params2,
$easyRefresh(
controller: logic.refreshController2,
tab: 2,
data: markingDatas2,
onLoad: onMyLoad,
onRefresh: onMyRefresh,
type: state.active,
data: state.workList,
onLoad: logic.onMyLoad,
onRefresh: logic.onMyRefresh,
logic: logic
),
],
);
}),
),*/
)
),
],
);
},
@ -241,4 +250,215 @@ class _HomePageState extends State<HomePage> {
Get.delete<HomeLogic>();
super.dispose();
}
}
///
/// OnRefreshCallback? onRefresh
///
@swidget
Widget $easyRefresh({
required EasyRefreshController controller,
required Future<
void> Function(EasyRefreshController controller, int tab) onRefresh,
required Future<
void> Function(EasyRefreshController controller, int tab) onLoad,
required List<Items> data,
required int tab,
required int type,
required HomeLogic logic,
}) {
bool completed = tab == 2; //
bool isPadFlag = Utils.isPad();
return Obx(() {
return EasyRefresh(
firstRefresh: false,
taskIndependence: true,
/*enableControlFinishLoad: true,
enableControlFinishRefresh: true,*/
emptyWidget: data.isEmpty ? const MyEmptyWidget() : null,
controller: controller,
header: MaterialHeader(),
footer: TaurusFooter(),
child: completed && isPadFlag
? GridView(
padding: EdgeInsets.only(
top: 11.h, bottom: 10.h, left: 12.w, right: 12.w),
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2, //widget
mainAxisSpacing: 10.h,
crossAxisSpacing: 6.w,
childAspectRatio: 1.81 //1widget
),
children: List.generate(data.length, (index) {
Items item = data[index];
String subjectName = logic.formatSubject(item.subject);
return $reviewedItem(jobTaskItem: item,type: type,subjectName:subjectName);
}),
)
: ListView.builder(
padding: EdgeInsets.only(top: 11.h, bottom: 10.h, left: 12.w, right: 12.w),
itemBuilder: (context, index) {
Items item = data[index];
return TaskListItem(completed:completed,jobTaskItem:item,type:type,logic: logic,);
/*HomeworkTasksViewItem(
completed: completed,
jobTaskItem: data[index],
call: () => controller.callRefresh(),
);*/
},
itemCount: data.length,
),
onRefresh: () => onRefresh(controller, tab),
onLoad: () => onLoad(controller, tab),
);
});
}
@swidget
Widget $reviewedItem({ required Items jobTaskItem, required int type,required String subjectName}) {
EdgeInsets padEdg = EdgeInsets.symmetric(horizontal: 10.w);
return InkWell(
onTap: () {
/* String url =
'${RouterManager.jobListParticipateInClassPath}?&jobId=${jobTaskItem.id}&genderName=${Uri.encodeComponent(jobTaskItem.genderName)}&jobName=${Uri.encodeComponent(jobTaskItem.title)}&completed=${true}';
RouterManager.router.navigateTo(context, url, transition: getTransition());*/
},
child: Container(
padding: EdgeInsets.only(top: 10.h),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(6.r),
color: Colors.white,
boxShadow: const [
BoxShadow(
color: Color.fromRGBO(210, 216, 241, 1),
offset: Offset.zero, //y轴偏移量
blurRadius: 5.8, //
spreadRadius: 0, //
)
],
),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
//
Padding(
padding: padEdg,
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
width: 32.w,
height: 18.h,
alignment: Alignment.center,
padding: EdgeInsets.only(left: 2.w),
decoration: BoxDecoration(
color: type == 1
? const Color.fromRGBO(104, 136, 253, 1)
: const Color.fromRGBO(255, 175, 56, 1),
borderRadius: BorderRadius.only(
topLeft: Radius.circular(14.r),
topRight: Radius.circular(3.r),
bottomLeft: Radius.circular(4.r),
bottomRight: Radius.circular(4.r),
),
),
margin: EdgeInsets.only(right: 4.w),
child: quickText(type == 1 ? '作业' : '考试', color: Colors.white,
size: 10.sp),
),
Expanded(
child: quickText(jobTaskItem.name, size: 14.sp,
color: const Color.fromRGBO(70, 70, 70, 1),
maxLines: 2),
)
],
),
),
Padding(
padding: padEdg,
child: Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
quickText(
jobTaskItem.publishTime.substring(0, 10),
color: const Color.fromRGBO(97, 97, 97, 1),
size: 10.sp,
fontWeight: FontWeight.w500,
),
quickText(' / ', color: const Color.fromRGBO(76, 199, 147, 1),
size: 10.sp,
fontWeight: FontWeight.w500),
quickText(
'参与班级:',
color: const Color.fromRGBO(76, 199, 147, 1),
size: 9.sp,
),
quickText(
'${jobTaskItem.classCount}',
color: const Color.fromRGBO(76, 199, 147, 1),
size: 10.sp,
),
quickText(' / ', color: const Color.fromRGBO(116, 145, 253, 1),
size: 10.sp,
fontWeight: FontWeight.w500),
quickText(
'科目:$subjectName',
color: const Color.fromRGBO(116, 145, 253, 1),
size: 9.sp,
),
],
),
),
/*Padding(
padding: EdgeInsets.symmetric(horizontal: 10.w),
child: FavoriteButton(
jobTaskItem.id,
jobTaskItem.title,
margin: EdgeInsets.only(top: 4.h, bottom: 6.h),
),
),*/
GestureDetector(
onTap: () {
/* RouterManager.router.navigateTo(
context,
RouterManager.jobReportPagePath +
'?title=${Uri.encodeComponent(jobTaskItem.title)}&id=${jobTaskItem.id}',
transition: getTransition(),
);*/
},
child: Container(
padding: EdgeInsets.symmetric(vertical: 6.h),
decoration: BoxDecoration(
borderRadius: BorderRadius.only(
bottomLeft: Radius.circular(6.r),
bottomRight: Radius.circular(6.r)),
color: Colors.white,
boxShadow: const [
BoxShadow(
color: Color.fromRGBO(0, 0, 0, 0.15),
offset: Offset(0, -0.0001), //y轴偏移量
blurRadius: 4, //
spreadRadius: 0, //
)
],
),
child: Row(children: [
Expanded(
child: Container(
alignment: Alignment.center,
child: quickText(
'查看报告', color: const Color.fromRGBO(118, 118, 118, 1),
size: 11.sp),
),
),
]),
),
),
],
),
),
);
}

View File

@ -0,0 +1,301 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:percent_indicator/percent_indicator.dart';
import 'package:school_asignment_app/common/job/work_student.dart';
import 'package:school_asignment_app/page/global_widget/my_text.dart';
import 'package:school_asignment_app/page/home_page/home_logic.dart';
import 'package:school_asignment_app/common/utils/utils.dart';
class TaskListItem extends StatefulWidget {
final bool completed;
final Items jobTaskItem;
final int type;
final HomeLogic logic;
const TaskListItem({Key? key,required this.completed,required this.jobTaskItem,required this.type,required this.logic}) : super(key: key);
@override
State<TaskListItem> createState() => _TaskListItemState();
}
class _TaskListItemState extends State<TaskListItem> {
@override
Widget build(BuildContext context) {
return widget.completed
? InkWell(
onTap: () {
/*String url =
'${RouterManager.jobListParticipateInClassPath}?&jobId=${jobTaskItem.id}&genderName=${Uri.encodeComponent(jobTaskItem.genderName)}&jobName=${Uri.encodeComponent(jobTaskItem.title)}&completed=${true}';
RouterManager.router.navigateTo(context, url, transition: getTransition());*/
},
child: Container(
width: double.infinity,
padding: EdgeInsets.only(top: 20.h),
margin: EdgeInsets.only(bottom: 12.h),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(6.r),
color: const Color.fromRGBO(255, 255, 255, 1),
boxShadow: const [
BoxShadow(
color: Color.fromRGBO(210, 216, 241, 1),
offset: Offset.zero, //y轴偏移量
blurRadius: 5.8, //
spreadRadius: 0, //
)
],
),
child: Column(
children: [
//
Padding(
padding: EdgeInsets.symmetric(horizontal: 10.w),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
width: Utils.isPad() ? 32.w : 36.w,
height: 18.h,
alignment: Alignment.center,
padding: EdgeInsets.only(left: Utils.isPad() ? 2.w : 3.w),
decoration: BoxDecoration(
color: const Color.fromRGBO(104, 136, 253, 1),
borderRadius: BorderRadius.only(
topLeft: Radius.circular(14.r),
topRight: Radius.circular(3.r),
bottomLeft: Radius.circular(4.r),
bottomRight: Radius.circular(4.r),
),
),
margin: EdgeInsets.only(right: 4.w),
child: quickText('作业', color: Colors.white, size: 10.sp),
),
Expanded(
child: quickText(
widget.jobTaskItem.name,
maxLines: 2,
size: 16.sp,
color: const Color.fromRGBO(70, 70, 70, 1),
fontWeight: FontWeight.bold,
),
)
],
),
),
SizedBox(height: 12.h),
Padding(
padding: EdgeInsets.symmetric(horizontal: 10.w),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
quickText(
widget.jobTaskItem.publishTime.substring(0, 10),
color: const Color.fromRGBO(97, 97, 97, 1),
size: 12.sp,
fontWeight: FontWeight.w500,
),
quickText(' / ', color: const Color.fromRGBO(76, 199, 147, 1), size: 12.sp, fontWeight: FontWeight.w500),
quickText(
'参与班级:${widget.jobTaskItem.classCount}',
color: const Color.fromRGBO(76, 199, 147, 1),
size: 12.sp,
fontWeight: FontWeight.w600,
),
quickText(' / ', color: const Color.fromRGBO(116, 145, 253, 1), size: 12.sp, fontWeight: FontWeight.w500),
quickText(
'科目:${widget.logic.formatSubject(widget.jobTaskItem.subject)}' ,
color: const Color.fromRGBO(116, 145, 253, 1),
size: 12.sp,
fontWeight: FontWeight.w600,
),
const Expanded(child: SizedBox()),
/* FavoriteButton(
jobTaskItem.id,
jobTaskItem.title,
margin: EdgeInsets.zero,
isRow: false,
),*/
],
),
),
SizedBox(height: 20.h),
Container(
padding: EdgeInsets.symmetric(vertical: 10.h),
decoration: BoxDecoration(
borderRadius: BorderRadius.only(bottomLeft: Radius.circular(6.r), bottomRight: Radius.circular(6.r)),
color: Colors.white,
boxShadow: const [
BoxShadow(
color: Color.fromRGBO(0, 0, 0, 0.15),
offset: Offset(0, -0.0001), //y轴偏移量
blurRadius: 4, //
spreadRadius: 0, //
)
],
),
child: Row(children: [
Expanded(
child: InkWell(
onTap: (){},
child: Container(
alignment: Alignment.center,
child: quickText('查看报告', color: const Color.fromRGBO(118, 118, 118, 1), size: 13.sp),
),
)),
]),
),
],
),
),
)
:
InkWell(
onTap: () {
/*String url =
'${RouterManager.jobListParticipateInClassPath}?&jobId=${jobTaskItem.id}&genderName=${Uri.encodeComponent(jobTaskItem.genderName)}&jobName=${Uri.encodeComponent(jobTaskItem.title)}';
RouterManager.router.navigateTo(context, url, transition: getTransition()).then((value) {
if (value != null && value == true) call();
});*/
},
child: Stack(
alignment: const FractionalOffset(0.95, 0),
children: [
Container(
margin: EdgeInsets.only(bottom: 16.h),
child: Column(
children: [
SizedBox(height: 30.h),
Container(
padding: EdgeInsets.symmetric(vertical: 16.h, horizontal: 10.w),
width: double.infinity,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(6.r),
color: const Color.fromRGBO(255, 255, 255, 1),
boxShadow: const [
BoxShadow(
color: Color.fromRGBO(210, 216, 241, 1),
offset: Offset.zero, //y轴偏移量
blurRadius: 5.8, //
spreadRadius: 0, //
)
],
),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
width: Utils.isPad() ? 32.w : 38.w,
height: 18.h,
alignment: Alignment.center,
padding: EdgeInsets.only(left: Utils.isPad() ? 2.w : 3.w),
decoration: BoxDecoration(
color: widget.type == 1
? const Color.fromRGBO(104, 136, 253, 1)
: const Color.fromRGBO(255, 175, 56, 1),
borderRadius: BorderRadius.only(
topLeft: Radius.circular(14.r),
topRight: Radius.circular(3.r),
bottomLeft: Radius.circular(4.r),
bottomRight: Radius.circular(4.r),
),
),
margin: EdgeInsets.only(right: 4.w),
child: quickText(widget.type == 1?'作业':'考试', color: Colors.white, size: 10.sp),
),
Expanded(
child: quickText(
widget.jobTaskItem.name,
maxLines: 2,
size: Utils.isPad() ? 14.sp : 16.sp,
color: const Color.fromRGBO(70, 70, 70, 1),
fontWeight: FontWeight.bold,
),
)
],
),
SizedBox(height: 10.h),
Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
quickText(
widget.logic.formatSubject(widget.jobTaskItem.subject),
color: const Color.fromRGBO(97, 97, 97, 1),
size: 12.sp,
),
quickText(' / ',
color: const Color.fromRGBO(130, 130, 130, 1), size: 11.sp, fontWeight: FontWeight.w500),
Container(
child: Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
quickText('题量:', color: const Color.fromRGBO(130, 130, 130, 1), size: 11.sp),
quickText(
'10',
color: const Color.fromRGBO(97, 97, 97, 1),
size: 13.sp,
),
],
),
),
quickText(' / ',
color: const Color.fromRGBO(130, 130, 130, 1), size: 11.sp, fontWeight: FontWeight.w500),
quickText(widget.jobTaskItem.publishTime.substring(0, 16),
color: const Color.fromRGBO(97, 97, 97, 1), size: 12.sp),
],
),
// FavoriteButton(jobTaskItem.id, jobTaskItem.title),
],
),
),
],
),
),
Container(
padding: EdgeInsets.all(9.r),
decoration: const BoxDecoration(shape: BoxShape.circle, color: Colors.white),
child: CircularPercentIndicator(
radius: 40.r,
lineWidth: 10.r,
animation: true,
percent: widget.jobTaskItem.annotateRate / 100,
center: Text.rich(TextSpan(children: [
TextSpan(
text: Utils.getDoubleRemoveZero(widget.jobTaskItem.annotateRate, '0'),
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 16.sp,
color: Theme.of(context).primaryColor,
),
),
TextSpan(
text: "%",
style: TextStyle(color: const Color.fromRGBO(70, 70, 70, 1), fontSize: 12.sp, fontWeight: FontWeight.bold),
),
])),
circularStrokeCap: CircularStrokeCap.round,
// progressColor: Theme.of(context).primaryColor,
linearGradient: LinearGradient(
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
tileMode: TileMode.clamp,
stops: const [0.0, 1.0],
colors: [
Theme.of(context).primaryColor.withOpacity(0.1),
Theme.of(context).primaryColor,
],
),
backgroundColor: const Color.fromRGBO(244, 244, 244, 1),
),
),
],
),
);
}
}

View File

@ -78,7 +78,7 @@ class LoginLogic extends GetxController with RequestToolMixin {
throw Exception('用户信息获取失败');
}
UserStore.to.setUserDetailInfo(data);
UserStore.to.getSubjectList();
EasyLoading.dismiss();
Get.offAllNamed(Routes.home);
// if (resultData.code != 200 || userData?.accessToken == null || userData?.accessToken == '') {

View File

@ -608,6 +608,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.2.1"
percent_indicator:
dependency: "direct main"
description:
name: percent_indicator
sha256: c37099ad833a883c9d71782321cb65c3a848c21b6939b6185f0ff6640d05814c
url: "https://pub.dev"
source: hosted
version: "4.2.3"
petitparser:
dependency: transitive
description:

View File

@ -68,6 +68,8 @@ dependencies:
json_annotation: ^4.8.1
retrofit: ^4.1.0
# end retrofit请求封装
# 进度条
percent_indicator: ^4.2.3
dev_dependencies:
@ -112,7 +114,10 @@ flutter:
# "family" key with the font family name, and a "fonts" key with a
# list giving the asset and other descriptors for the font. For
# example:
# fonts:
fonts:
- family: AlibabaIcon
fonts:
- asset: assets/icons/iconfont.ttf
# - family: Schyler
# fonts:
# - asset: fonts/Schyler-Regular.ttf