taskIndex.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639
  1. <template>
  2. <div class="bgborder" style="background-color:#F2F3F6;min-height:calc(100vh - 80px);padding:0 10px 10px 10px">
  3. <div class="stylus-head">
  4. <div class="stylus-title">
  5. <span style="font-size: 22px;letter-spacing: 1px;font-weight: 600;color: #333B4A;padding-left: 15px">任务</span>
  6. <div class="new-tab-open">
  7. <el-switch
  8. v-model="newTabOpen"
  9. active-text="新标签页跳转"
  10. @change="logHandle('switchJumpOpen')"
  11. />
  12. </div>
  13. <div>
  14. <el-button
  15. type="primary"
  16. size="mini"
  17. @click="open_created"
  18. >新建任务</el-button>
  19. </div>
  20. </div>
  21. <el-divider style="color: #EEF0F5;" />
  22. <div class="Layout" style="padding: 5px 0 0 15px">
  23. <div>
  24. <el-form :model="form_task" class="Layout">
  25. <div class="Layout_flex_end">
  26. <div class="queryName">任务名称</div>
  27. <el-input v-model="form_task.name" size="small" clearable style="width:72% !important;" placeholder="请输入标题或ID或望岳ID" @change="get_taskList()" />
  28. </div>
  29. <div class="Layout">
  30. <div class="queryName marginLeft">负责人</div>
  31. <el-select
  32. v-model="form_task.PersonInCharge"
  33. clearable
  34. filterable
  35. remote
  36. placeholder="请输入姓名或邮箱前缀"
  37. :remote-method="remoteMethod"
  38. :loading="loading"
  39. size="small"
  40. @change="get_taskList()"
  41. >
  42. <el-option v-for="item in options" :key="item.idap" :label="item.name" :value="test2(item, 0)">
  43. <div class="flex_start">
  44. <div class="deptName">{{ item.deptName }}</div>
  45. <div style="min-width:80px">{{ item.name }}</div>
  46. <div class="deptName">{{ item.idap }}</div>
  47. </div>
  48. </el-option>
  49. </el-select>
  50. </div>
  51. <div class="Layout">
  52. <div class="queryName marginLeft">优先级</div>
  53. <el-select v-model="form_task.priority" size="small" clearable filterable placeholder="请选择" @change="get_taskList()">
  54. <el-option v-for="item in arr_priority" :key="item.value" :label="item.name" :value="item.value" />
  55. </el-select>
  56. </div>
  57. </el-form>
  58. </div>
  59. <span class="screen" @click="showSelect">{{ goodName }}</span>
  60. </div>
  61. <div v-show="DetailedScreening" class="stylus-more">
  62. <div>
  63. <div class="Layout">
  64. <el-form :model="form_task" class="flex_start">
  65. <div class="Layout">
  66. <div class="queryName">所属项目</div>
  67. <el-select v-model="form_task.projectId" size="small" clearable filterable placeholder="请选择">
  68. <el-option v-for="item in projectList" :key="item.id" :label="item.name" :value="item.id" />
  69. </el-select>
  70. </div>
  71. <div class="Layout marginLeft">
  72. <div class="queryName">所属需求</div>
  73. <el-select v-model="form_task.requireId" size="small" clearable filterable placeholder="请选择">
  74. <el-option v-for="item in demandList" :key="item.id" :label="item.name" :value="item.id" />
  75. </el-select>
  76. </div>
  77. <div class="Layout marginLeft">
  78. <div class="queryName">来自望岳</div>
  79. <el-select v-model="form_task.isFromDpm" size="small" clearable filterable placeholder="请选择">
  80. <el-option v-for="item in isFromDpmList" :key="item.id" :label="item.name" :value="item.id" />
  81. </el-select>
  82. </div>
  83. </el-form>
  84. </div>
  85. <div class="Layout" style="margin: 15px 0;">
  86. <el-form :model="form_task" class="flex_start">
  87. <div class="Layout">
  88. <div class="queryName">模块</div>
  89. <el-cascader v-model="form_task.moduleIds" size="small" clearable collapse-tags :props="props" :options="business_platform_Modular" placeholder="请选择" style="width:77% !important;" />
  90. </div>
  91. <div class="Layout marginLeft">
  92. <div class="queryName">状态</div>
  93. <el-select v-model="form_task.status" size="small" clearable filterable placeholder="请选择">
  94. <el-option v-for="item in daStatus" :key="item.code" :label="item.msg" :value="item.code" />
  95. </el-select>
  96. </div>
  97. <div class="Layout marginLeft">
  98. <div class="queryName">健康状态</div>
  99. <el-select v-model="form_task.stage" size="small" clearable filterable placeholder="请选择">
  100. <el-option v-for="item in healthStage" :key="item.code" :label="item.msg" :value="item.code" />
  101. </el-select>
  102. </div>
  103. </el-form>
  104. </div>
  105. <div class="Layout" style="margin: 15px 0;">
  106. <el-form :model="form_task" class="flex_start">
  107. <div class="Layout">
  108. <div class="queryName" style="width:86px;">创建人</div>
  109. <el-select
  110. v-model="form_task.creater"
  111. clearable
  112. filterable
  113. remote
  114. placeholder="请输入姓名或邮箱前缀"
  115. :remote-method="remoteMethod"
  116. :loading="loading"
  117. size="small"
  118. style="width: 82%;"
  119. >
  120. <el-option v-for="item in options" :key="item.idap" :label="item.name" :value="test2(item, 0)">
  121. <div class="flex_start">
  122. <div class="deptName">{{ item.deptName }}</div>
  123. <div style="min-width:80px">{{ item.name }}</div>
  124. <div class="deptName">{{ item.idap }}</div>
  125. </div>
  126. </el-option>
  127. </el-select>
  128. </div>
  129. <div class="Layout marginLeft">
  130. <div class="queryName">创建日期</div>
  131. <el-date-picker
  132. v-model="form_task.date"
  133. type="daterange"
  134. align="right"
  135. unlink-panels
  136. range-separator="至"
  137. start-placeholder="开始日期"
  138. end-placeholder="结束日期"
  139. size="small"
  140. value-format="yyyy-MM-dd HH:mm:ss"
  141. :default-time="['00:00:00','23:59:59']"
  142. :picker-options="pickerOptions"
  143. />
  144. </div>
  145. </el-form>
  146. </div>
  147. <div align="right">
  148. <el-button type="primary" size="mini" @click="get_taskList(form_task)">筛 选</el-button>
  149. <el-button size="mini" @click="query_Reset">重 置</el-button>
  150. </div>
  151. </div>
  152. </div>
  153. </div>
  154. <div class="stylus-content">
  155. <el-table
  156. v-loading="table_loading"
  157. :data="task_table"
  158. style="width: 100%;"
  159. highlight-current-row
  160. :header-cell-style="{ 'color':'rgba(74,74,74,1)','font-size':'14px','font-weight':'500' }"
  161. :cell-style="{ 'font-size':'14px','color':'rgba(102,102,102,1)' }"
  162. size="small"
  163. show-overflow-tooltip="true"
  164. >
  165. <el-table-column label="优先级" min-width="100" prop="priority" sortable align="left">
  166. <template slot-scope="scope">
  167. <div class="div_priority" :style="{background: priorityColors[scope.row.priority]}">{{ scope.row.priorityString }}</div>
  168. </template>
  169. </el-table-column>
  170. <el-table-column label="任务名称" min-width="250" show-overflow-tooltip align="left">
  171. <template slot-scope="scope">
  172. <span style="font-size: 12px;color: rgba(167,174,188,1);">
  173. {{ scope.row.taskIdSting }}
  174. <span
  175. v-if="scope.row.tagNotification !== null && scope.row.status !== -2"
  176. :class="{
  177. 'tagNotification': scope.row.tagType === 0,
  178. 'tagNotification1': scope.row.tagType === 1
  179. }"
  180. >
  181. {{ scope.row.tagNotification }}
  182. </span>
  183. <span v-if="scope.row.status === -2" class="tagNotification1"> {{ 'hold' }} </span>
  184. </span><br>
  185. <span class="stylus-hover" @click="link_task(scope.row.id)">{{ scope.row.name }}</span>
  186. </template>
  187. </el-table-column>
  188. <el-table-column label="状态" min-width="150" align="center" show-overflow-tooltip>
  189. <template slot-scope="scope">{{ scope.row.statusString }}</template>
  190. </el-table-column>
  191. <el-table-column label="健康状态" width="150" align="center" show-overflow-tooltip>
  192. <template slot-scope="scope">{{ scope.row.stageString }}</template>
  193. </el-table-column>
  194. <el-table-column label="开发负责人" min-width="100" align="center">
  195. <template
  196. slot-scope="scope"
  197. >{{ scope.row.rdObject !== null? scope.row.rdObject.name: '' }}</template>
  198. </el-table-column>
  199. <el-table-column label="测试负责人" min-width="100" align="center">
  200. <template
  201. slot-scope="scope"
  202. >{{ scope.row.qaObject !== null?scope.row.qaObject.name: '' }}</template>
  203. </el-table-column>
  204. <el-table-column label="所属模块" width="150" align="center" show-overflow-tooltip>
  205. <template slot-scope="scope">{{ scope.row.moduleInfoName }}</template>
  206. </el-table-column>
  207. <el-table-column label="是否免测" min-width="80" align="center">
  208. <template slot-scope="scope">{{ scope.row.noTestString }}</template>
  209. </el-table-column>
  210. <el-table-column label="缺陷数量" width="250" align="center" show-overflow-tooltip>
  211. <template slot-scope="scope">{{ scope.row.bugCount }}</template>
  212. </el-table-column>
  213. <el-table-column label="所属需求" min-width="250" align="center" show-overflow-tooltip>
  214. <template slot-scope="scope">{{ scope.row.requireName }}</template>
  215. </el-table-column>
  216. <el-table-column label="所属项目" min-width="250" align="center" show-overflow-tooltip>
  217. <template slot-scope="scope">{{ scope.row.projectName }}</template>
  218. </el-table-column>
  219. <el-table-column label="创建人" min-width="120" align="center" show-overflow-tooltip>
  220. <template slot-scope="scope">{{ scope.row.createObject.name }}</template>
  221. </el-table-column>
  222. <el-table-column label="创建日期" min-width="120" align="center" show-overflow-tooltip>
  223. <template slot-scope="scope">{{ scope.row.createTime }}</template>
  224. </el-table-column>
  225. </el-table>
  226. <div align="right">
  227. <el-pagination
  228. background
  229. :current-page="currentPage"
  230. :page-sizes="[15,30,45,total]"
  231. :page-size="15"
  232. layout="total, sizes, prev, pager, next, jumper"
  233. :total="total"
  234. @size-change="handleSizeChange"
  235. @current-change="handleCurrentChange"
  236. />
  237. </div>
  238. </div>
  239. <!-- 弹窗 -->
  240. <openDialog v-if="dialog_open" ref="task_createdUpdata" />
  241. </div>
  242. </template>
  243. <script>
  244. import { EncryptId } from '@/utils/crypto-js.js'
  245. import { mapGetters } from 'vuex'
  246. import { log } from '@/utils/global'
  247. import {
  248. taskList,
  249. configShowTaskEnum,
  250. memberQueryMemberInfoByIDAPorName,
  251. configShowRequirementVersionEnum,
  252. projectListProject,
  253. configShowTaskStatusEnum
  254. } from '@/api/taskIndex' // ajax
  255. import { settingQueryBizModuleList } from '@/api/defectManage'
  256. import openDialog from '@/views/projectManage/dialog_vue'
  257. import '@/views/projectManage/publicCss/index.css'
  258. import '@/styles/PublicStyle/index.scss'
  259. export default {
  260. components: {
  261. openDialog
  262. },
  263. data() {
  264. return {
  265. pickerOptions: {
  266. shortcuts: [{
  267. text: '最近一周',
  268. onClick(picker) {
  269. const end = new Date()
  270. const start = new Date()
  271. start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
  272. picker.$emit('pick', [start, end])
  273. }
  274. }, {
  275. text: '最近一个月',
  276. onClick(picker) {
  277. const end = new Date()
  278. const start = new Date()
  279. start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
  280. picker.$emit('pick', [start, end])
  281. }
  282. }, {
  283. text: '最近三个月',
  284. onClick(picker) {
  285. const end = new Date()
  286. const start = new Date()
  287. start.setTime(start.getTime() - 3600 * 1000 * 24 * 90)
  288. picker.$emit('pick', [start, end])
  289. }
  290. }]
  291. },
  292. newTabOpen: true, // 是否新的tab页打开
  293. header_show: true,
  294. props: {
  295. value: 'id',
  296. label: 'moduleName',
  297. children: 'childModules',
  298. multiple: true
  299. },
  300. isFromDpmList: [{ id: true, name: '是' }, { id: false, name: '否' }],
  301. priorityColors: ['#F56C6C', '#FF8952', '#F5E300', '#7ED321', '#61D3B8', '#69B3FF', '#BDBDBD'],
  302. arr_priority: [{ value: 0, name: 'P0' }, { value: 1, name: 'P1' }, { value: 2, name: 'P2' }, { value: 3, name: 'P3' }],
  303. dialog_open: false,
  304. curIndex: 1,
  305. pageSize: 15,
  306. goodName: '更多筛选',
  307. options: [],
  308. daStatus: [], // 任务状态筛选option
  309. healthStage: [],
  310. list: [],
  311. userInformation: localStorage.getItem('username'),
  312. userNames: localStorage.getItem('realname'),
  313. form_task: {},
  314. noTest: [], // 是否免测
  315. BusinessLine: [], // 业务线
  316. appClient: [], // 涉及业务线
  317. arr_platform: [], // 平台数据
  318. business_platform_Modular: [], // 模块数据
  319. arr_taskName: [], // 任务名称数据
  320. projectList: [], // 归属项目数据
  321. demandList: [], // 需求list
  322. dialogFormVisible: false,
  323. currentPage: 0,
  324. DetailedScreening: false,
  325. total: 0,
  326. biz: '',
  327. isToOne: true,
  328. loading: false,
  329. table_loading: false,
  330. test: {},
  331. task_table: [],
  332. form: {},
  333. arry: []
  334. }
  335. },
  336. computed: {
  337. ...mapGetters(['bizId'])
  338. },
  339. watch: {
  340. bizId() {
  341. this.get_taskList()
  342. this.get_taskSelect()
  343. }
  344. },
  345. created() {
  346. this.get_taskList()
  347. this.get_taskSelect()
  348. this.$store.state.data.status = true
  349. },
  350. mounted() {
  351. this.$nextTick(() => {
  352. this.bugDataGet()
  353. })
  354. },
  355. destroyed() {
  356. this.$store.state.data.status = false
  357. },
  358. methods: {
  359. logHandle(d) {
  360. log({ c: 'task', d })
  361. },
  362. test2(item, e) {
  363. // 获取团队人员信息
  364. if (typeof this.test[item.idap] === 'undefined') {
  365. item.role = e
  366. this.test[item.idap] = item
  367. }
  368. return item.idap
  369. },
  370. get_taskList(e) {
  371. if (this.bizId === -1) return
  372. // 查询
  373. if (this.isToOne) {
  374. this.curIndex = 1
  375. this.currentPage = 1
  376. }
  377. this.table_loading = true
  378. this.form_task.bizId = this.bizId
  379. this.form_task.pageSize = this.pageSize
  380. this.form_task.curIndex = this.curIndex
  381. for (const key in this.form_task) { // 接口不接受空值的处理
  382. if (this.form_task[key] === '') {
  383. delete this.form_task[key]
  384. }
  385. }
  386. if (this.form_task.date) {
  387. this.form_task.createTimeBegin = this.form_task.date[0]
  388. this.form_task.createTimeEnd = this.form_task.date[1]
  389. } else {
  390. delete this.form_task.createTimeBegin
  391. delete this.form_task.createTimeEnd
  392. }
  393. taskList(this.form_task).then(res => {
  394. this.task_table = res.data
  395. this.total = res.total
  396. this.table_loading = false
  397. })
  398. configShowRequirementVersionEnum({ bizId: this.bizId }).then(res => {
  399. // 获取需求(查询)
  400. this.demandList = res.data
  401. })
  402. this.isToOne = true
  403. },
  404. remoteMethod(query) {
  405. // 人员查询
  406. if (query !== '') {
  407. this.loading = true
  408. setTimeout(() => {
  409. this.loading = false
  410. memberQueryMemberInfoByIDAPorName({ memberIDAP: query }).then(res => {
  411. const obj = {}
  412. this.options = res.data.reduce((cur, next) => {
  413. obj[next.idap] ? '' : obj[next.idap] = true && cur.push(next)
  414. return cur
  415. }, [])
  416. })
  417. }, 200)
  418. } else {
  419. this.options = []
  420. }
  421. },
  422. showSelect() {
  423. this.DetailedScreening = !this.DetailedScreening
  424. this.goodName === '更多筛选' ? this.goodName = '收起筛选' : this.goodName = '更多筛选'
  425. },
  426. team_dates(e) {
  427. // 改变成员
  428. this.form.arry = []
  429. for (const i in e) {
  430. this.form.arry.push(this.test[e[i]])
  431. }
  432. this.arry = this.form.arry.map(item => {
  433. return { memberIDAP: item.idap, department: item.deptid, role: 0 }
  434. })
  435. },
  436. open_created() {
  437. // 打开弹窗
  438. this.dialog_open = true
  439. this.$nextTick(() => {
  440. this.$refs.task_createdUpdata.init(1)
  441. })
  442. },
  443. link_task(id) {
  444. const bizId_id = EncryptId(`${this.bizId}_${id}`)
  445. if (this.newTabOpen) {
  446. const newTab = this.$router.resolve({ name: '任务详情', query: { bizId_id: bizId_id }})
  447. window.open(newTab.href, '_blank')
  448. } else {
  449. this.$router.push({ name: '任务详情', query: { bizId_id: bizId_id }})
  450. }
  451. },
  452. query_Reset() {
  453. // 重置
  454. this.$set(this.form_task, 'bizId', '')
  455. this.$set(this.form_task, 'status', '')
  456. this.$set(this.form_task, 'stage', '')
  457. this.$set(this.form_task, 'id', '')
  458. this.$set(this.form_task, 'projectId', '')
  459. this.$set(this.form_task, 'requireId', '')
  460. this.$set(this.form_task, 'PersonInCharge', '')
  461. this.$set(this.form_task, 'Participant', '')
  462. this.$set(this.form_task, 'creater', '')
  463. this.$set(this.form_task, 'isFromDpm', '')
  464. this.$set(this.form_task, 'date', [])
  465. this.$message({
  466. message: '已重置',
  467. type: 'success',
  468. duration: 1000,
  469. offset: 150
  470. })
  471. },
  472. handleSizeChange(size) {
  473. // 分页
  474. this.pageSize = size
  475. this.isToOne = false
  476. this.get_taskList(1)
  477. },
  478. handleCurrentChange(curIndex) {
  479. // 分页
  480. this.curIndex = curIndex
  481. this.currentPage = curIndex
  482. this.isToOne = false
  483. this.get_taskList()
  484. },
  485. async get_taskSelect() {
  486. if (this.bizId === -1) return
  487. // 下拉菜单数据
  488. const res = await configShowTaskEnum()
  489. if (res.code === 200) {
  490. this.healthStage = res.data.taskStage
  491. this.noTest = res.data.noTest // 是否免测
  492. this.taskSource = res.data.taskSource // 归属需求
  493. this.appClient = res.data.appClient // 涉及客户端
  494. }
  495. const res1 = await configShowTaskStatusEnum(this.bizId)
  496. if (res1.code === 200) {
  497. this.daStatus = res1.data.taskStatus
  498. }
  499. const res2 = await projectListProject({ bizId: this.bizId })
  500. if (res2.code === 200) {
  501. this.projectList = res2.data
  502. }
  503. },
  504. bugDataGet() { // 所属模块
  505. this.biz = this.bizId
  506. if (this.bizId === -1) {
  507. this.biz = this.$store.state.global.bizId
  508. }
  509. settingQueryBizModuleList(this.biz).then(res => {
  510. this.business_platform_Modular = this.getRequireData(res.data)
  511. })
  512. },
  513. getRequireData(data) {
  514. for (let i = 0; i < data.length; i++) {
  515. data[i].childModules && data[i].childModules.length < 1 ? delete data[i].childModules : this.getRequireData(data[i].childModules)
  516. }
  517. return data
  518. }
  519. }
  520. }
  521. </script>
  522. <style lang="scss" scoped>
  523. .stylus-head {
  524. position: relative;
  525. }
  526. .new-tab-open {
  527. position: absolute;
  528. left: 120px;
  529. }
  530. </style>
  531. <style>
  532. .el-loading-mask {
  533. z-index: 8;
  534. }
  535. .requirement-xx .el-table .cell {
  536. padding: 5px 0;
  537. font-size: 14px;
  538. font-family: MicrosoftYaHei;
  539. }
  540. .requirement-xx .el-table .el-table__body tr:hover td { color: #409EFF; background: #EDF6FF; } /*hover时字体, 背景颜色*/
  541. .footer {
  542. text-align: right;
  543. margin: 1%;
  544. background-color: #ffffff;
  545. border-radius: 4px;
  546. }
  547. .bgborder .el-table .cell {
  548. box-sizing: border-box;
  549. overflow: hidden;
  550. text-overflow: ellipsis;
  551. word-break: break-all;
  552. line-height: 23px;
  553. padding-right: 10px;
  554. margin: -6px 0 -2px 0 !important;
  555. }
  556. .el-table .warning-row {
  557. background: oldlace;
  558. }
  559. .drop_down {
  560. font-size: 14px;
  561. color: #333333;
  562. }
  563. .requirement_el-dropdown-menu {
  564. max-height: 300px !important;
  565. max-width: 200px;
  566. overflow: auto !important;
  567. }
  568. .el-dropdown-menu__item:not(.is-disabled):hover {
  569. background-color: #f6f7fa;
  570. color: #606266;
  571. }
  572. .div_priority {
  573. color: #ffffff;
  574. width:fit-content;
  575. padding: 0 12px;
  576. border-radius: 4px;
  577. margin-left: 4px;
  578. }
  579. .tagNotification {
  580. background: rgba(255,137,82,15%);
  581. color: #FF8952;
  582. padding: 0 5px;
  583. border-radius: 8px;
  584. margin-left: 10px;
  585. }
  586. .tagNotification1 {
  587. background: rgba(245,108,108,17%);
  588. color: #F56C6C;
  589. padding: 0 5px;
  590. border-radius: 8px;
  591. margin-left: 10px;
  592. }
  593. </style>
  594. <style lang="stylus" scoped>
  595. .stylus-head >>> .el-form-item__label
  596. color #333333
  597. font-weight 400
  598. .stylus-content >>> .el-table .el-table__body tr:hover td
  599. // color #409EFF !important
  600. background #EDF6FF
  601. .stylus-head >>> .el-divider--horizontal
  602. margin 10px 0
  603. .stylus-head >>> .el-form-item
  604. margin-bottom 0
  605. .stylus-head
  606. width 100%
  607. padding 15px
  608. margin-bottom: 10px
  609. background-color white
  610. border-radius 4px
  611. .stylus-title
  612. display flex
  613. justify-content space-between
  614. align-items center
  615. .stylus-more
  616. background rgba(252,252,252,1)
  617. border-radius 4px
  618. padding 15px
  619. min-height 100px
  620. margin-top 22px
  621. border 1px solid rgba(238,238,238,1)
  622. width 100%
  623. .stylus-content
  624. width 100%
  625. padding 0.3% 1% 1% 1%
  626. margin:0 auto
  627. background-color white
  628. border-radius 4px
  629. min-height: calc(100vh - 143px);
  630. .stylus-hover:hover
  631. color #409EFF !important
  632. cursor pointer
  633. </style>