MarkerHeader.vue 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. <template>
  2. <div class="marker-header">
  3. <div class="header-group">
  4. <div class="header-part">
  5. <Dropdown
  6. v-if="areas.length > 1"
  7. placement="bottom"
  8. transfer
  9. trigger="click"
  10. transfer-class-name="marker-dropdown"
  11. @on-click="areaClick"
  12. >
  13. <span class="el-dropdown-link">
  14. {{ curArea.areaName }} <Icon type="ios-arrow-down"></Icon>
  15. </span>
  16. <DropdownMenu slot="list">
  17. <DropdownItem
  18. v-for="area in areas"
  19. :key="area.id"
  20. :name="area.id"
  21. >{{ area.areaName }}</DropdownItem
  22. >
  23. </DropdownMenu>
  24. </Dropdown>
  25. <p v-else>{{ curArea.areaName }}</p>
  26. </div>
  27. <div v-if="showStatistics" class="header-part" @click="toStatistics">
  28. <p>统计分析 <Icon type="ios-arrow-down"></Icon></p>
  29. </div>
  30. <div class="header-part">
  31. <Poptip
  32. popper-class="marker-popper"
  33. placement="bottom"
  34. width="312"
  35. transfer
  36. v-model="pageVisible"
  37. >
  38. <p v-if="showPaperRelateCount">
  39. 当前页:<span>{{ page.current }}</span
  40. >/<span>{{ page.totalPage }} </span>
  41. <Icon type="ios-arrow-down"></Icon>
  42. </p>
  43. <p v-else>
  44. <span>翻页操作</span>
  45. <Icon type="ios-arrow-down"></Icon>
  46. </p>
  47. <div class="marker-page" slot="content">
  48. <div class="marker-page-shortcut">
  49. <div class="shortcut-item" @click="toFirstPage">首页</div>
  50. <div class="shortcut-item" @click="toPrevPage">上一页</div>
  51. <div class="shortcut-item" @click="toNextPage">下一页</div>
  52. <div class="shortcut-item" @click="toLastPage">尾页</div>
  53. </div>
  54. <div class="marker-page-size">
  55. <h4>每页张数:</h4>
  56. <div class="page-size-list">
  57. <div
  58. :class="[
  59. 'page-size-item',
  60. { 'page-size-item-act': page.size === item }
  61. ]"
  62. v-for="item in pageSizeList"
  63. :key="item"
  64. @click="pageSizeChange(item)"
  65. >
  66. {{ item }}
  67. </div>
  68. </div>
  69. </div>
  70. <div v-if="showPaperRelateCount" class="marker-page-set">
  71. <span>当前页:</span>
  72. <p>
  73. <span>{{ page.current }}</span
  74. >/<span>{{ page.totalPage }} </span>
  75. </p>
  76. </div>
  77. <div v-if="showPaperRelateCount" class="marker-page-set">
  78. <span>总张数:</span>
  79. <p>
  80. <span>{{ page.total }}</span>
  81. </p>
  82. </div>
  83. <div class="marker-page-set">
  84. <span>页面跳转:</span>
  85. <InputNumber
  86. size="small"
  87. :min="1"
  88. :max="page.totalPage"
  89. :step="1"
  90. :precision="0"
  91. v-model="pageNo"
  92. ></InputNumber>
  93. <div class="marker-page-btn" @click="pageNoSet">跳转</div>
  94. </div>
  95. </div>
  96. </Poptip>
  97. </div>
  98. </div>
  99. <div class="header-group">
  100. <div class="header-part header-step">
  101. <Dropdown
  102. placement="bottom"
  103. transfer
  104. trigger="click"
  105. transfer-class-name="marker-dropdown header-step-dropdown"
  106. @on-click="stepClick"
  107. >
  108. <span class="el-dropdown-link">
  109. <i>{{ curStep.name }}</i>
  110. <i v-if="showPaperRelateCount">:{{ curStep.count }} </i>
  111. <Icon type="ios-arrow-down"></Icon>
  112. </span>
  113. <DropdownMenu slot="list">
  114. <DropdownItem
  115. class="header-step-item"
  116. v-for="step in steps.otherStep"
  117. :key="step.type"
  118. :name="step.name"
  119. >
  120. <i>{{ step.name }}</i>
  121. <i v-if="showPaperRelateCount">({{ step.count }})</i>
  122. </DropdownItem>
  123. <DropdownItem
  124. class="header-step-item"
  125. v-for="step in steps.levelStep"
  126. :key="step.name"
  127. :name="step.name"
  128. >
  129. <i>{{ step.name }}</i>
  130. <i v-if="showPaperRelateCount"
  131. >({{ step.count }} / {{ step.gcount }})</i
  132. >
  133. </DropdownItem>
  134. </DropdownMenu>
  135. </Dropdown>
  136. </div>
  137. <div v-if="IS_MARK_LEADER" class="header-part" @click="toProgress">
  138. <p>{{ stageName }}进度 <Icon type="ios-arrow-down"></Icon></p>
  139. </div>
  140. <div v-if="showStandard" class="header-part" @click="toStandard">
  141. <p>标准卷 <Icon type="ios-arrow-down"></Icon></p>
  142. </div>
  143. <div class="header-part header-history" @click="toHistory">
  144. <p>操作记录 <Icon type="ios-arrow-down"></Icon></p>
  145. </div>
  146. <div class="header-user">
  147. <Dropdown
  148. placement="bottom"
  149. transfer
  150. trigger="click"
  151. transfer-class-name="marker-dropdown"
  152. @on-click="userClick"
  153. >
  154. <div class="user-name">
  155. <Icon type="md-person" size="16" /> {{ username }}
  156. <Icon type="ios-arrow-down"></Icon>
  157. </div>
  158. <DropdownMenu slot="list">
  159. <DropdownItem class="color-default-hover" name="toResetPwd"
  160. >修改密码</DropdownItem
  161. >
  162. <DropdownItem class="color-error-hover" name="logout">
  163. 退出登录
  164. </DropdownItem>
  165. </DropdownMenu>
  166. </Dropdown>
  167. </div>
  168. </div>
  169. <!-- ResetPwd -->
  170. <reset-pwd ref="ResetPwd"></reset-pwd>
  171. </div>
  172. </template>
  173. <script>
  174. import { mapState, mapMutations } from "vuex";
  175. import { areaList, logout } from "@/api";
  176. import ResetPwd from "@/modules/login/ResetPwd";
  177. export default {
  178. name: "marker-header",
  179. components: { ResetPwd },
  180. props: {
  181. showStandard: {
  182. type: Boolean,
  183. default: true
  184. },
  185. showStatistics: {
  186. type: Boolean,
  187. default: true
  188. }
  189. },
  190. data() {
  191. return {
  192. filter: {
  193. workId: "",
  194. subject: ""
  195. },
  196. curUserRoleType: "",
  197. username: this.$ls.get("user", { loginName: "" }).loginName,
  198. pageVisible: false,
  199. pageSizeList: [2, 3, 4, 6, 8, 9, 10, 12, 15, 16, 20, 24],
  200. pageNo: 1
  201. };
  202. },
  203. computed: {
  204. ...mapState("marker", [
  205. "paramsSet",
  206. "page",
  207. "curStep",
  208. "steps",
  209. "curArea",
  210. "curSubject",
  211. "areas"
  212. ]),
  213. IS_MARK_LEADER() {
  214. return this.curUserRoleType === "MARK_LEADER";
  215. },
  216. stageName() {
  217. return this.curSubject.stage === "LEVEL" ? "分档" : "打分";
  218. },
  219. showPaperRelateCount() {
  220. return !!this.paramsSet["showPaperCount"];
  221. }
  222. },
  223. mounted() {
  224. const subjectId = this.$route.params.subjectId.split("-");
  225. this.filter.workId = subjectId[0];
  226. this.filter.subject = subjectId[1];
  227. this.curUserRoleType = this.$ls.get("user", { role: "" }).role;
  228. this.getAreaList();
  229. },
  230. methods: {
  231. ...mapMutations("marker", ["setPage", "setAreas"]),
  232. async getAreaList() {
  233. const data = await areaList(this.filter);
  234. const areas = data.map(item => {
  235. return {
  236. id: item.id,
  237. areaName: item.areaName,
  238. areaCode: item.areaCode
  239. };
  240. });
  241. this.setAreas(areas);
  242. if (!this.curArea.id) {
  243. this.$emit("area-change", areas[0]);
  244. }
  245. },
  246. areaClick(val) {
  247. if (this.curArea.id === val) return;
  248. const curArea = this.areas.find(item => item.id === val);
  249. this.$emit("area-change", curArea);
  250. },
  251. stepClick(val) {
  252. const curStep = [...this.steps.levelStep, ...this.steps.otherStep].find(
  253. item => item.name === val
  254. );
  255. this.$emit("step-change", curStep);
  256. },
  257. toProgress() {
  258. this.$emit("to-progress");
  259. },
  260. toHistory() {
  261. this.$emit("to-history");
  262. },
  263. toStandard() {
  264. this.$emit("to-standard");
  265. },
  266. toStatistics() {
  267. this.$emit("to-statistics");
  268. },
  269. pageNoSet() {
  270. this.setPage({ current: this.pageNo });
  271. this.pageSetChange();
  272. },
  273. toFirstPage() {
  274. this.setPage({ current: 1 });
  275. this.pageSetChange();
  276. },
  277. toLastPage() {
  278. this.setPage({ current: this.page.totalPage });
  279. this.pageSetChange();
  280. },
  281. toPrevPage() {
  282. if (this.page.current === 1) return;
  283. this.setPage({ current: this.page.current - 1 });
  284. this.pageSetChange();
  285. },
  286. toNextPage() {
  287. if (this.page.current === this.page.totalPage) return;
  288. this.setPage({ current: this.page.current + 1 });
  289. this.pageSetChange();
  290. },
  291. pageSizeChange(size) {
  292. this.setPage({ size });
  293. this.pageSetChange();
  294. },
  295. pageSetChange() {
  296. this.pageVisible = false;
  297. this.$emit("page-set-change", this.page);
  298. },
  299. userClick(name) {
  300. if (!name) return;
  301. this[name]();
  302. },
  303. toResetPwd() {
  304. this.$refs.ResetPwd.open();
  305. },
  306. async logout() {
  307. await logout();
  308. this.$ls.clear();
  309. this.$router.push({ name: "Login" });
  310. }
  311. }
  312. };
  313. </script>