diff --git a/assets/icons/demo.css b/assets/icons/demo.css new file mode 100644 index 0000000..a67054a --- /dev/null +++ b/assets/icons/demo.css @@ -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; +} diff --git a/assets/icons/demo_index.html b/assets/icons/demo_index.html new file mode 100644 index 0000000..d81cd85 --- /dev/null +++ b/assets/icons/demo_index.html @@ -0,0 +1,1499 @@ + + + + + iconfont Demo + + + + + + + + + + + + + +
+

+ + +

+ +
+
+
    + +
  • + +
    Frame
    +
    
    +
  • + +
  • + +
    Frame
    +
    
    +
  • + +
  • + +
    Frame-1
    +
    
    +
  • + +
  • + +
    Frame
    +
    
    +
  • + +
  • + +
    Frame-2
    +
    
    +
  • + +
  • + +
    Frame
    +
    
    +
  • + +
  • + +
    Frame
    +
    
    +
  • + +
  • + +
    Frame-1
    +
    
    +
  • + +
  • + +
    Frame-3
    +
    
    +
  • + +
  • + +
    Frame-2
    +
    
    +
  • + +
  • + +
    Frame
    +
    
    +
  • + +
  • + +
    继续阅卷
    +
    
    +
  • + +
  • + +
    Frame
    +
    
    +
  • + +
  • + +
    阅卷记录
    +
    
    +
  • + +
  • + +
    Frame
    +
    
    +
  • + +
  • + +
    Frame1
    +
    
    +
  • + +
  • + +
    1
    +
    
    +
  • + +
  • + +
    Frame
    +
    
    +
  • + +
  • + +
    Frame-1
    +
    
    +
  • + +
  • + +
    Frame
    +
    
    +
  • + +
  • + +
    Frame-1
    +
    
    +
  • + +
  • + +
    Frame
    +
    
    +
  • + +
  • + +
    Frame-1
    +
    
    +
  • + +
  • + +
    Frame-2
    +
    
    +
  • + +
  • + +
    Frame-3
    +
    
    +
  • + +
  • + +
    Frame-4
    +
    
    +
  • + +
  • + +
    Frame-5
    +
    
    +
  • + +
  • + +
    Frame-6
    +
    
    +
  • + +
  • + +
    Frame-7
    +
    
    +
  • + +
  • + +
    Frame-8
    +
    
    +
  • + +
  • + +
    Frame-9
    +
    
    +
  • + +
  • + +
    equal
    +
    
    +
  • + +
  • + +
    warning
    +
    
    +
  • + +
  • + +
    error
    +
    
    +
  • + +
  • + +
    Frame-1
    +
    
    +
  • + +
  • + +
    Frame
    +
    
    +
  • + +
  • + +
    Frame-2
    +
    
    +
  • + +
  • + +
    Frame-3
    +
    
    +
  • + +
  • + +
    Frame-4
    +
    
    +
  • + +
  • + +
    Frame-9
    +
    
    +
  • + +
  • + +
    Frame-8
    +
    
    +
  • + +
  • + +
    Frame-13
    +
    
    +
  • + +
  • + +
    Frame-12
    +
    
    +
  • + +
  • + +
    Frame-15
    +
    
    +
  • + +
  • + +
    Frame-17
    +
    
    +
  • + +
  • + +
    Frame-11
    +
    
    +
  • + +
  • + +
    Frame-16
    +
    
    +
  • + +
  • + +
    Frame-7
    +
    
    +
  • + +
  • + +
    Frame-14
    +
    
    +
  • + +
  • + +
    Frame-10
    +
    
    +
  • + +
  • + +
    Frame-5
    +
    
    +
  • + +
  • + +
    Frame-6
    +
    
    +
  • + +
  • + +
    Frame-2
    +
    
    +
  • + +
  • + +
    Frame-3
    +
    
    +
  • + +
  • + +
    Frame-1
    +
    
    +
  • + +
  • + +
    Frame
    +
    
    +
  • + +
  • + +
    Frame-4
    +
    
    +
  • + +
+
+

Unicode 引用

+
+ +

Unicode 是字体在网页端最原始的应用方式,特点是:

+
    +
  • 支持按字体的方式去动态调整图标大小,颜色等等。
  • +
  • 默认情况下不支持多色,直接添加多色图标会自动去色。
  • +
+
+

注意:新版 iconfont 支持两种方式引用多色图标:SVG symbol 引用方式和彩色字体图标模式。(使用彩色字体图标需要在「编辑项目」中开启「彩色」选项后并重新生成。)

+
+

Unicode 使用步骤如下:

+

第一步:拷贝项目下面生成的 @font-face

+
@font-face {
+  font-family: 'iconfont';
+  src: url('iconfont.woff2?t=1710142362036') format('woff2'),
+       url('iconfont.woff?t=1710142362036') format('woff'),
+       url('iconfont.ttf?t=1710142362036') format('truetype');
+}
+
+

第二步:定义使用 iconfont 的样式

+
.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+

第三步:挑选相应图标并获取字体编码,应用于页面

+
+<span class="iconfont">&#x33;</span>
+
+
+

"iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。

+
+
+
+
+
    + +
  • + +
    + Frame +
    +
    .icon-Frame14 +
    +
  • + +
  • + +
    + Frame +
    +
    .icon-Frame13 +
    +
  • + +
  • + +
    + Frame-1 +
    +
    .icon-Frame-113 +
    +
  • + +
  • + +
    + Frame +
    +
    .icon-Frame12 +
    +
  • + +
  • + +
    + Frame-2 +
    +
    .icon-Frame-24 +
    +
  • + +
  • + +
    + Frame +
    +
    .icon-Frame10 +
    +
  • + +
  • + +
    + Frame +
    +
    .icon-Frame9 +
    +
  • + +
  • + +
    + Frame-1 +
    +
    .icon-Frame-112 +
    +
  • + +
  • + +
    + Frame-3 +
    +
    .icon-Frame-33 +
    +
  • + +
  • + +
    + Frame-2 +
    +
    .icon-Frame-23 +
    +
  • + +
  • + +
    + Frame +
    +
    .icon-Frame8 +
    +
  • + +
  • + +
    + 继续阅卷 +
    +
    .icon-Frame7 +
    +
  • + +
  • + +
    + Frame +
    +
    .icon-Frame6 +
    +
  • + +
  • + +
    + 阅卷记录 +
    +
    .icon-yuejuanjilu +
    +
  • + +
  • + +
    + Frame +
    +
    .icon-Frame5 +
    +
  • + +
  • + +
    + Frame1 +
    +
    .icon-Frame11 +
    +
  • + +
  • + +
    + 1 +
    +
    .icon-a-1 +
    +
  • + +
  • + +
    + Frame +
    +
    .icon-Frame4 +
    +
  • + +
  • + +
    + Frame-1 +
    +
    .icon-Frame-110 +
    +
  • + +
  • + +
    + Frame +
    +
    .icon-Frame3 +
    +
  • + +
  • + +
    + Frame-1 +
    +
    .icon-Frame-19 +
    +
  • + +
  • + +
    + Frame +
    +
    .icon-Frame2 +
    +
  • + +
  • + +
    + Frame-1 +
    +
    .icon-Frame-18 +
    +
  • + +
  • + +
    + Frame-2 +
    +
    .icon-Frame-22 +
    +
  • + +
  • + +
    + Frame-3 +
    +
    .icon-Frame-32 +
    +
  • + +
  • + +
    + Frame-4 +
    +
    .icon-Frame-42 +
    +
  • + +
  • + +
    + Frame-5 +
    +
    .icon-Frame-51 +
    +
  • + +
  • + +
    + Frame-6 +
    +
    .icon-Frame-61 +
    +
  • + +
  • + +
    + Frame-7 +
    +
    .icon-Frame-71 +
    +
  • + +
  • + +
    + Frame-8 +
    +
    .icon-Frame-81 +
    +
  • + +
  • + +
    + Frame-9 +
    +
    .icon-Frame-91 +
    +
  • + +
  • + +
    + equal +
    +
    .icon-equal +
    +
  • + +
  • + +
    + warning +
    +
    .icon-warning +
    +
  • + +
  • + +
    + error +
    +
    .icon-error +
    +
  • + +
  • + +
    + Frame-1 +
    +
    .icon-Frame-11 +
    +
  • + +
  • + +
    + Frame +
    +
    .icon-Frame1 +
    +
  • + +
  • + +
    + Frame-2 +
    +
    .icon-Frame-21 +
    +
  • + +
  • + +
    + Frame-3 +
    +
    .icon-Frame-31 +
    +
  • + +
  • + +
    + Frame-4 +
    +
    .icon-Frame-41 +
    +
  • + +
  • + +
    + Frame-9 +
    +
    .icon-Frame-9 +
    +
  • + +
  • + +
    + Frame-8 +
    +
    .icon-Frame-8 +
    +
  • + +
  • + +
    + Frame-13 +
    +
    .icon-Frame-13 +
    +
  • + +
  • + +
    + Frame-12 +
    +
    .icon-Frame-12 +
    +
  • + +
  • + +
    + Frame-15 +
    +
    .icon-Frame-15 +
    +
  • + +
  • + +
    + Frame-17 +
    +
    .icon-Frame-17 +
    +
  • + +
  • + +
    + Frame-11 +
    +
    .icon-Frame-111 +
    +
  • + +
  • + +
    + Frame-16 +
    +
    .icon-Frame-16 +
    +
  • + +
  • + +
    + Frame-7 +
    +
    .icon-Frame-7 +
    +
  • + +
  • + +
    + Frame-14 +
    +
    .icon-Frame-14 +
    +
  • + +
  • + +
    + Frame-10 +
    +
    .icon-Frame-10 +
    +
  • + +
  • + +
    + Frame-5 +
    +
    .icon-Frame-5 +
    +
  • + +
  • + +
    + Frame-6 +
    +
    .icon-Frame-6 +
    +
  • + +
  • + +
    + Frame-2 +
    +
    .icon-Frame-2 +
    +
  • + +
  • + +
    + Frame-3 +
    +
    .icon-Frame-3 +
    +
  • + +
  • + +
    + Frame-1 +
    +
    .icon-Frame-1 +
    +
  • + +
  • + +
    + Frame +
    +
    .icon-Frame +
    +
  • + +
  • + +
    + Frame-4 +
    +
    .icon-Frame-4 +
    +
  • + +
+
+

font-class 引用

+
+ +

font-class 是 Unicode 使用方式的一种变种,主要是解决 Unicode 书写不直观,语意不明确的问题。

+

与 Unicode 使用方式相比,具有如下特点:

+
    +
  • 相比于 Unicode 语意明确,书写更直观。可以很容易分辨这个 icon 是什么。
  • +
  • 因为使用 class 来定义图标,所以当要替换图标时,只需要修改 class 里面的 Unicode 引用。
  • +
+

使用步骤如下:

+

第一步:引入项目下面生成的 fontclass 代码:

+
<link rel="stylesheet" href="./iconfont.css">
+
+

第二步:挑选相应图标并获取类名,应用于页面:

+
<span class="iconfont icon-xxx"></span>
+
+
+

" + iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。

+
+
+
+
+
    + +
  • + +
    Frame
    +
    #icon-Frame14
    +
  • + +
  • + +
    Frame
    +
    #icon-Frame13
    +
  • + +
  • + +
    Frame-1
    +
    #icon-Frame-113
    +
  • + +
  • + +
    Frame
    +
    #icon-Frame12
    +
  • + +
  • + +
    Frame-2
    +
    #icon-Frame-24
    +
  • + +
  • + +
    Frame
    +
    #icon-Frame10
    +
  • + +
  • + +
    Frame
    +
    #icon-Frame9
    +
  • + +
  • + +
    Frame-1
    +
    #icon-Frame-112
    +
  • + +
  • + +
    Frame-3
    +
    #icon-Frame-33
    +
  • + +
  • + +
    Frame-2
    +
    #icon-Frame-23
    +
  • + +
  • + +
    Frame
    +
    #icon-Frame8
    +
  • + +
  • + +
    继续阅卷
    +
    #icon-Frame7
    +
  • + +
  • + +
    Frame
    +
    #icon-Frame6
    +
  • + +
  • + +
    阅卷记录
    +
    #icon-yuejuanjilu
    +
  • + +
  • + +
    Frame
    +
    #icon-Frame5
    +
  • + +
  • + +
    Frame1
    +
    #icon-Frame11
    +
  • + +
  • + +
    1
    +
    #icon-a-1
    +
  • + +
  • + +
    Frame
    +
    #icon-Frame4
    +
  • + +
  • + +
    Frame-1
    +
    #icon-Frame-110
    +
  • + +
  • + +
    Frame
    +
    #icon-Frame3
    +
  • + +
  • + +
    Frame-1
    +
    #icon-Frame-19
    +
  • + +
  • + +
    Frame
    +
    #icon-Frame2
    +
  • + +
  • + +
    Frame-1
    +
    #icon-Frame-18
    +
  • + +
  • + +
    Frame-2
    +
    #icon-Frame-22
    +
  • + +
  • + +
    Frame-3
    +
    #icon-Frame-32
    +
  • + +
  • + +
    Frame-4
    +
    #icon-Frame-42
    +
  • + +
  • + +
    Frame-5
    +
    #icon-Frame-51
    +
  • + +
  • + +
    Frame-6
    +
    #icon-Frame-61
    +
  • + +
  • + +
    Frame-7
    +
    #icon-Frame-71
    +
  • + +
  • + +
    Frame-8
    +
    #icon-Frame-81
    +
  • + +
  • + +
    Frame-9
    +
    #icon-Frame-91
    +
  • + +
  • + +
    equal
    +
    #icon-equal
    +
  • + +
  • + +
    warning
    +
    #icon-warning
    +
  • + +
  • + +
    error
    +
    #icon-error
    +
  • + +
  • + +
    Frame-1
    +
    #icon-Frame-11
    +
  • + +
  • + +
    Frame
    +
    #icon-Frame1
    +
  • + +
  • + +
    Frame-2
    +
    #icon-Frame-21
    +
  • + +
  • + +
    Frame-3
    +
    #icon-Frame-31
    +
  • + +
  • + +
    Frame-4
    +
    #icon-Frame-41
    +
  • + +
  • + +
    Frame-9
    +
    #icon-Frame-9
    +
  • + +
  • + +
    Frame-8
    +
    #icon-Frame-8
    +
  • + +
  • + +
    Frame-13
    +
    #icon-Frame-13
    +
  • + +
  • + +
    Frame-12
    +
    #icon-Frame-12
    +
  • + +
  • + +
    Frame-15
    +
    #icon-Frame-15
    +
  • + +
  • + +
    Frame-17
    +
    #icon-Frame-17
    +
  • + +
  • + +
    Frame-11
    +
    #icon-Frame-111
    +
  • + +
  • + +
    Frame-16
    +
    #icon-Frame-16
    +
  • + +
  • + +
    Frame-7
    +
    #icon-Frame-7
    +
  • + +
  • + +
    Frame-14
    +
    #icon-Frame-14
    +
  • + +
  • + +
    Frame-10
    +
    #icon-Frame-10
    +
  • + +
  • + +
    Frame-5
    +
    #icon-Frame-5
    +
  • + +
  • + +
    Frame-6
    +
    #icon-Frame-6
    +
  • + +
  • + +
    Frame-2
    +
    #icon-Frame-2
    +
  • + +
  • + +
    Frame-3
    +
    #icon-Frame-3
    +
  • + +
  • + +
    Frame-1
    +
    #icon-Frame-1
    +
  • + +
  • + +
    Frame
    +
    #icon-Frame
    +
  • + +
  • + +
    Frame-4
    +
    #icon-Frame-4
    +
  • + +
+
+

Symbol 引用

+
+ +

这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇文章 + 这种用法其实是做了一个 SVG 的集合,与另外两种相比具有如下特点:

+
    +
  • 支持多色图标了,不再受单色限制。
  • +
  • 通过一些技巧,支持像字体那样,通过 font-size, color 来调整样式。
  • +
  • 兼容性较差,支持 IE9+,及现代浏览器。
  • +
  • 浏览器渲染 SVG 的性能一般,还不如 png。
  • +
+

使用步骤如下:

+

第一步:引入项目下面生成的 symbol 代码:

+
<script src="./iconfont.js"></script>
+
+

第二步:加入通用 CSS 代码(引入一次就行):

+
<style>
+.icon {
+  width: 1em;
+  height: 1em;
+  vertical-align: -0.15em;
+  fill: currentColor;
+  overflow: hidden;
+}
+</style>
+
+

第三步:挑选相应图标并获取类名,应用于页面:

+
<svg class="icon" aria-hidden="true">
+  <use xlink:href="#icon-xxx"></use>
+</svg>
+
+
+
+ +
+
+ + + diff --git a/assets/icons/iconfont.css b/assets/icons/iconfont.css new file mode 100644 index 0000000..7ae4d3f --- /dev/null +++ b/assets/icons/iconfont.css @@ -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"; +} + diff --git a/assets/icons/iconfont.js b/assets/icons/iconfont.js new file mode 100644 index 0000000..79e8e53 --- /dev/null +++ b/assets/icons/iconfont.js @@ -0,0 +1 @@ +window._iconfont_svg_string_3423846='',function(c){var a=(a=document.getElementsByTagName("script"))[a.length-1],l=a.getAttribute("data-injectcss"),a=a.getAttribute("data-disable-injectsvg");if(!a){var h,i,t,o,m,v=function(a,l){l.parentNode.insertBefore(a,l)};if(l&&!c.__iconfont__svg__cssinject__){c.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(a){console&&console.log(a)}}h=function(){var a,l=document.createElement("div");l.innerHTML=c._iconfont_svg_string_3423846,(l=l.getElementsByTagName("svg")[0])&&(l.setAttribute("aria-hidden","true"),l.style.position="absolute",l.style.width=0,l.style.height=0,l.style.overflow="hidden",l=l,(a=document.body).firstChild?v(l,a.firstChild):a.appendChild(l))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(h,0):(i=function(){document.removeEventListener("DOMContentLoaded",i,!1),h()},document.addEventListener("DOMContentLoaded",i,!1)):document.attachEvent&&(t=h,o=c.document,m=!1,F(),o.onreadystatechange=function(){"complete"==o.readyState&&(o.onreadystatechange=null,e())})}function e(){m||(m=!0,t())}function F(){try{o.documentElement.doScroll("left")}catch(a){return void setTimeout(F,50)}e()}}(window); \ No newline at end of file diff --git a/assets/icons/iconfont.json b/assets/icons/iconfont.json new file mode 100644 index 0000000..0cc4adc --- /dev/null +++ b/assets/icons/iconfont.json @@ -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 + } + ] +} diff --git a/assets/icons/iconfont.ttf b/assets/icons/iconfont.ttf new file mode 100644 index 0000000..7a00b33 Binary files /dev/null and b/assets/icons/iconfont.ttf differ diff --git a/assets/icons/iconfont.woff b/assets/icons/iconfont.woff new file mode 100644 index 0000000..3f5f987 Binary files /dev/null and b/assets/icons/iconfont.woff differ diff --git a/assets/icons/iconfont.woff2 b/assets/icons/iconfont.woff2 new file mode 100644 index 0000000..70e83d1 Binary files /dev/null and b/assets/icons/iconfont.woff2 differ diff --git a/assets/images/not_data_bgm2.png b/assets/images/not_data_bgm2.png new file mode 100644 index 0000000..dbb719a Binary files /dev/null and b/assets/images/not_data_bgm2.png differ diff --git a/lib/common/api/retrofit_client.dart b/lib/common/api/retrofit_client.dart index 37d5d69..ea30120 100644 --- a/lib/common/api/retrofit_client.dart +++ b/lib/common/api/retrofit_client.dart @@ -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 getWorkList(@Queries() WorkStudentParams params); + + @GET("/api/app/Common/GetEnumInfos") + Future>> getEnumSubjectList(@Query('enumNames') String enumNames); } diff --git a/lib/common/job/enum_subject.dart b/lib/common/job/enum_subject.dart new file mode 100644 index 0000000..e53ee91 --- /dev/null +++ b/lib/common/job/enum_subject.dart @@ -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 srcJson) => _$EnumSubjectFromJson(srcJson); + + Map toJson() => _$EnumSubjectToJson(this); + +} + + diff --git a/lib/common/job/work_student.dart b/lib/common/job/work_student.dart index 41ace82..32bc86e 100644 --- a/lib/common/job/work_student.dart +++ b/lib/common/job/work_student.dart @@ -49,7 +49,7 @@ class Items extends Object { int collectRate; @JsonKey(name: 'annotateRate') - int annotateRate; + double annotateRate; @JsonKey(name: 'classes') List 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 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,); diff --git a/lib/common/request/rest_dio.dart b/lib/common/request/rest_dio.dart index 2d5a15c..4cbdc63 100644 --- a/lib/common/request/rest_dio.dart +++ b/lib/common/request/rest_dio.dart @@ -29,7 +29,6 @@ class RequestTool { return RetrofitClient(dio, baseUrl: RequestConfig().baseUrl); } - final RetrofitClient _client; static RequestTool? _instance; diff --git a/lib/common/store/user_store.dart b/lib/common/store/user_store.dart index 88830dc..7858aab 100644 --- a/lib/common/store/user_store.dart +++ b/lib/common/store/user_store.dart @@ -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 userDetailInfo = Rx(null); + RxList 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']!; + } } diff --git a/lib/common/utils/utils.dart b/lib/common/utils/utils.dart index 101e553..71af9c0 100644 --- a/lib/common/utils/utils.dart +++ b/lib/common/utils/utils.dart @@ -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 _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 ?? ''; + } + } } \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index 93b01ce..1fe9f92 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -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), diff --git a/lib/page/global_widget/MyEmptyWidget.dart b/lib/page/global_widget/MyEmptyWidget.dart new file mode 100644 index 0000000..4febf96 --- /dev/null +++ b/lib/page/global_widget/MyEmptyWidget.dart @@ -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: [ + 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)), + ), + ) + ], + ), + ); + } +} diff --git a/lib/page/home_page/home_logic.dart b/lib/page/home_page/home_logic.dart index 8d7b484..c0200b6 100644 --- a/lib/page/home_page/home_logic.dart +++ b/lib/page/home_page/home_logic.dart @@ -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 onMyRefresh(EasyRefreshController controller, int tab) async { + /* params.page = RequestConfig.basePage.page; + List lists = await getData(controller, params, isReFresh: true); + try { + tab == 1 ? (markingDatas1 = lists) : (markingDatas2 = lists); + } catch (e) {} + toUpState(setState, () {}, mounted);*/ + getList(); + + } + + /// 加载方法 + Future onMyLoad(EasyRefreshController controller, int tab) async { + /*params.page++; + List 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 showStudents( + BuildContext context, [ + bool? submitted = false, + String? className, + ]) async { + ToastUtils.showLoading(); + List 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(); } } diff --git a/lib/page/home_page/home_state.dart b/lib/page/home_page/home_state.dart index f4ccff5..16b2743 100644 --- a/lib/page/home_page/home_state.dart +++ b/lib/page/home_page/home_state.dart @@ -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; int active = 1; - late RxList workList = RxList(); + late RxList workList = RxList(); late RxInt tabIndex = 0.obs; late bool completedToRefresh = true; } diff --git a/lib/page/home_page/home_view.dart b/lib/page/home_page/home_view.dart index 5751a8c..5245b20 100644 --- a/lib/page/home_page/home_view.dart +++ b/lib/page/home_page/home_view.dart @@ -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 { 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 { // _refreshController2.callRefresh(); state.completedToRefresh = false; } + logic.getList(); }, tabs: [ Tab( @@ -167,15 +174,16 @@ class _HomePageState extends State { 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 { _refreshController2.callRefresh(); }, ),*/ - /* Expanded( - child: Obx(() { - return IndexedStack( + Expanded( + child: IndexedStack( index: state.tabIndex.value, children: [ - $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 { Get.delete(); 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 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 //宽高比为1时,子widget + ), + 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), + ), + ), + ]), + ), + ), + ], + ), + ), + ); } \ No newline at end of file diff --git a/lib/page/home_page/widget/task_list_item.dart b/lib/page/home_page/widget/task_list_item.dart new file mode 100644 index 0000000..64aeb19 --- /dev/null +++ b/lib/page/home_page/widget/task_list_item.dart @@ -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 createState() => _TaskListItemState(); +} + +class _TaskListItemState extends State { + + + @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), + ), + ), + ], + ), + ); + } +} diff --git a/lib/page/login_page/login_logic.dart b/lib/page/login_page/login_logic.dart index 3e09f2c..303f322 100644 --- a/lib/page/login_page/login_logic.dart +++ b/lib/page/login_page/login_logic.dart @@ -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 == '') { diff --git a/pubspec.lock b/pubspec.lock index 2c96fb0..abfd627 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -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: diff --git a/pubspec.yaml b/pubspec.yaml index 2357cec..2d8a479 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -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