KnowPoint.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399
  1. <template>
  2. <div class="know-main center">
  3. <div class="content-wrap">
  4. <div class="header-wrap">
  5. <Input placeholder="关键词搜索知识点" style="width:25% !important;" />
  6. <div class="list-type center">
  7. <Icon type="md-menu" size="20" :class="listType==0?'list-type-active':''" @click="changeListType(0)"/>
  8. <Icon type="ios-keypad" size="20" :class="listType==1?'list-type-active':''" @click="changeListType(1)"/>
  9. </div>
  10. <div class="header-right">
  11. <div class="header-right-item" @click="addPoint" v-show="listType==1">
  12. <Icon type="logo-buffer" size="18" />
  13. <span>新增知识点</span>
  14. </div>
  15. <div class="header-right-item" @click="composeBlock" v-show="listType==1 && pointCheckedList.length > 0">
  16. <Icon type="logo-buffer" size="18" />
  17. <span>组成知识块</span>
  18. </div>
  19. <div class="header-right-item" @click="addBlock" v-show="listType==0">
  20. <Icon type="ios-browsers" size="18" />
  21. <span>新增知识块</span>
  22. </div>
  23. <div class="header-right-item">
  24. <Icon type="ios-cloud-download" size="18" />
  25. <span>导入知识点</span>
  26. </div>
  27. </div>
  28. </div>
  29. <div class="sy-list-wrap">
  30. <!-- 知识块 -->
  31. <div class="list-col" v-if="isShowBlock">
  32. <Collapse simple accordion @on-change="collapseChange">
  33. <Panel v-for="(item,index) in knowBlockList" class="know-block-item" :key="index" :name="item.period">
  34. <Input v-if="item.id==block_edit_id" :ref="'block'+item.id" clearable type="text" v-model="item.name"
  35. @on-blur="editKnowBlock(item)"
  36. @on-enter="editKnowBlock(item)"
  37. @click.stop.native="inputFocus($event)" />
  38. <span class="know-block-name" v-else>{{item.name}} | {{item.id}}</span>
  39. <span class="know-block-builder">建立者 | {{item.builder}}</span>
  40. <span class="k-block-tools">
  41. <Icon type="md-create" @click="handleEditBlock(item,$event)" title="编辑名称" />
  42. <Icon type="md-add-circle" title="编辑知识点" @click.stop.native="editBlockPoint(item)"/>
  43. <Icon type="md-trash" @click="handleDeleteBlock" title="删除"/>
  44. </span>
  45. <div slot="content" class="knowpoints">
  46. <div class="knowpoint-item" v-for="(item,index) in knowPointList" @mouseover="knowMouseover" @mouseout="knowMouseout">
  47. <Input v-if="item.id==point_edit_id" :ref="'point'+item.blockId+item.id" clearable type="text" v-model="item.name"
  48. @on-blur="editKnowPoint(item)"
  49. @on-enter="editKnowPoint(item)"
  50. @click.stop.native="inputFocus($event)" />
  51. <span v-else>{{item.name}} </span>
  52. <span class="k-tools">
  53. <Icon type="md-create" @click="handleEditPoint(item,$event)" />
  54. <Icon type="md-trash" @click.stop.native="handleDeleteBlock" />
  55. </span>
  56. </div>
  57. </div>
  58. </Panel>
  59. </Collapse>
  60. </div>
  61. <!-- 知识点仓库 -->
  62. <div class="list-col list-knowpoints" v-else>
  63. <div class="knowpoints-filter">
  64. <span :class="filter_index == 0 ? 'sort-active':''" @click="filterSort(0)">综合排序</span>
  65. <span :class="filter_index == 1 ? 'sort-active':''" @click="filterSort(1)">名称排序</span>
  66. <span :class="filter_index == 2 ? 'sort-active':''" @click="filterSort(2)">创建时间排序</span>
  67. </div>
  68. <div class="knowpoints">
  69. <div v-for="(item,index) in knowPointList" :class="['knowpoint-item',pointCheckedList.indexOf(item) != -1?'knowpoint-item-active':'']" :title="item.description" @mouseover="knowMouseover" @mouseout="knowMouseout" @click="pointClick(item)">
  70. <Input v-if="item.id==point_edit_id" :ref="'point'+item.blockId+item.id" clearable type="text" v-model="item.name"
  71. @on-blur="editKnowPoint(item)"
  72. @on-enter="editKnowPoint(item)"
  73. @click.stop.native="inputFocus($event)" />
  74. <span v-else class="overflow-text">{{item.name}} </span>
  75. <!--<Icon type="ios-checkmark-circle" color="#00fa00" class="icon-checked"/>-->
  76. <span class="k-tools">
  77. <Icon type="md-create" @click="handleEditPoint(item,$event)" />
  78. <Icon type="md-trash" @click.stop.native="handleDeleteBlock" />
  79. </span>
  80. </div>
  81. </div>
  82. <Page :current="2" :total="50" simple class="center" style="margin:20px 0"/>
  83. </div>
  84. <Modal v-model="addBlockModal"
  85. title="新增知识块"
  86. width="520"
  87. ok-text="确认"
  88. cancel-text="取消"
  89. @on-ok="handleAddBlock"
  90. @on-cancel="">
  91. <p class="modal-title">请输入知识块名称</p>
  92. <Input v-model="newBlockName" placeholder="输入名称" style="margin:5px" />
  93. </Modal>
  94. <Modal v-model="addPointModal"
  95. title="新增知识点"
  96. width="520"
  97. ok-text="确认"
  98. cancel-text="取消"
  99. @on-ok="handleAddPoint"
  100. @on-cancel="">
  101. <p class="modal-title">请输入知识点名称</p>
  102. <Input v-model="newPointName" placeholder="输入名称" style="margin:5px" />
  103. <p class="modal-title">请输入知识点描述</p>
  104. <Input v-model="newPointName" placeholder="输入描述" style="margin:5px" />
  105. </Modal>
  106. <Modal v-model="editBlockPointModal"
  107. title="编辑知识块"
  108. width="600"
  109. ok-text="确认"
  110. cancel-text="取消"
  111. @on-ok="handleAddBlock"
  112. @on-cancel="">
  113. <Transfer :data="data3"
  114. :target-keys="targetKeys3"
  115. :list-style="listStyle"
  116. :render-format="render3"
  117. :operations="['撤回知识库','加入知识块']"
  118. filter-placeholder="请输入搜索内容"
  119. :titles="['知识点仓库', '当前知识块']"
  120. not-found-text="列表为空"
  121. filterable
  122. :filter-method="filterMethod"
  123. @on-change="handleChange3">
  124. <div :style="{float: 'right', margin: '5px'}">
  125. <Button size="small" @click="reloadMockData">刷新</Button>
  126. </div>
  127. </Transfer>
  128. </Modal>
  129. <!-- 组成知识块弹窗 -->
  130. <Modal v-model="composeBlockModal"
  131. title="组成知识块"
  132. width="400"
  133. ok-text="确认"
  134. cancel-text="取消"
  135. @on-ok="handleComposeBlock"
  136. @on-cancel="">
  137. <Tabs value="newBlock" class="compose-block-tab">
  138. <TabPane label="建立新的知识块" name="newBlock">
  139. <p class="modal-title">请输入知识块名称</p>
  140. <Input v-model="newComposeName" placeholder="请输入" style="margin:5px" />
  141. <p class="modal-title">当前选中知识点</p>
  142. <div class="checked-points">
  143. <div v-for="item in pointCheckedList" class="knowpoint-item knowpoint-item-active">{{item.name}}</div>
  144. </div>
  145. </TabPane>
  146. <TabPane label="移动到现有知识块" name="moveToBlock">
  147. <RadioGroup v-model="checkedBlock">
  148. <Radio v-for="(item,index) in knowBlockList" :key="index" :label="item.name+item.id" :value="item.period" :name="item.period"></Radio>
  149. </RadioGroup>
  150. </TabPane>
  151. </Tabs>
  152. </Modal>
  153. </div>
  154. </div>
  155. </div>
  156. </template>
  157. <script scoped>
  158. export default {
  159. name: "KnowPoint",
  160. data() {
  161. return {
  162. knowPointList: [],
  163. knowBlockList: [],
  164. pointCheckedList: [],
  165. checkedBlock:"知识块名称0",
  166. isShowBlock: false,
  167. listType: 1,
  168. filter_index:0,
  169. newBlockName:"",
  170. newPointName:"",
  171. newComposeName:"",
  172. block_edit_id: null, //当前知识块编辑索引
  173. point_edit_id: null, //当前知识点编辑索引
  174. point_click_id:null,
  175. addBlockModal: false, //新增知识块开关
  176. addPointModal: false, //新增知识点开关
  177. editBlockPointModal: false, //编辑知识块开关
  178. composeBlockModal: false, //编辑知识块开关
  179. data3: this.getMockData(),
  180. targetKeys3: this.getTargetKeys(),
  181. listStyle: {
  182. width: '220px',
  183. height: '420px'
  184. },
  185. }
  186. },
  187. created() {
  188. for (let i = 0; i < 11; i++) {
  189. this.knowPointList.push({
  190. id: i,
  191. key: i.toString(),
  192. label: i.toString(),
  193. name: "知识点名称1111_" + this.changeNumFormat(i),
  194. blockId: i + 1,
  195. description: "知识点名称1111_" + this.changeNumFormat(i)
  196. })
  197. this.knowBlockList.push({
  198. id: i,
  199. name: "知识块名称",
  200. period: i.toString(),
  201. builder: "郭金凤",
  202. userNum: i + 5
  203. })
  204. }
  205. },
  206. methods: {
  207. //知识点与知识块切换
  208. changeListType(status) {
  209. this.listType = status;
  210. this.isShowBlock = status == 0;
  211. },
  212. //数字格式转换
  213. changeNumFormat(num) {
  214. let nums = num.toString();
  215. if (nums.length == 1) {
  216. nums = '00' + nums;
  217. } else if (nums.length == 2) {
  218. nums = '0' + nums;
  219. }
  220. return nums;
  221. },
  222. //鼠标滑入事件显示操作选项
  223. knowMouseover(e) {
  224. e.stopPropagation();
  225. e.currentTarget.lastElementChild.style.visibility = 'visible';
  226. },
  227. //鼠标滑出事件隐藏操作选项
  228. knowMouseout(e) {
  229. e.stopPropagation();
  230. e.currentTarget.lastElementChild.style.visibility = 'hidden';
  231. },
  232. //折叠版切换回调
  233. collapseChange(arr) {
  234. this.block_edit_id = null;
  235. let list = document.getElementsByClassName('k-block-tools');
  236. for (let i = 0 ; i < list.length ;i++) {
  237. if (arr.indexOf(i.toString()) != -1) {
  238. list[i].style.visibility = "visible";
  239. } else {
  240. list[i].style.visibility = "hidden";
  241. }
  242. }
  243. },
  244. filterSort(index) {
  245. this.filter_index = index;
  246. },
  247. //点击编辑知识块
  248. handleEditBlock(data, e) {
  249. e.stopPropagation();
  250. this.block_edit_id = data.id;
  251. this.$nextTick(() => {
  252. this.$refs['block' + data.id][0].focus();
  253. })
  254. },
  255. //编辑知识块input失焦
  256. editKnowBlock(data) {
  257. this.block_edit_id = null;
  258. },
  259. //点击编辑知识点
  260. handleEditPoint(data, e) {
  261. e.stopPropagation();
  262. this.point_edit_id = data.id;
  263. this.$nextTick(() => {
  264. this.$refs['point'+data.blockId+data.id][0].focus();
  265. })
  266. },
  267. //编辑知识点input失焦
  268. editKnowPoint(data) {
  269. this.point_edit_id = null;
  270. },
  271. //input聚焦
  272. inputFocus(e) {
  273. e.cancelBubble = true;
  274. },
  275. //request删除知识块
  276. handleDeleteBlock() {
  277. this.$Modal.confirm({
  278. title: '删除知识块',
  279. content: '<p>确认删除该知识块?</p>',
  280. okText:"确认",
  281. cancelText:"取消",
  282. onOk: () => {
  283. this.$Message.info('Clicked ok');
  284. },
  285. onCancel: () => {
  286. this.$Message.info('Clicked cancel');
  287. }
  288. });
  289. },
  290. //点击新增知识块弹窗
  291. addBlock() {
  292. this.addBlockModal = true;
  293. },
  294. //点击新增知识块弹窗
  295. addPoint() {
  296. this.addPointModal = true;
  297. },
  298. //点击组成知识块弹窗
  299. composeBlock() {
  300. if (this.pointCheckedList.length < 1) {
  301. this.$Message.info('请先勾选需要操作的知识点!');
  302. } else {
  303. this.composeBlockModal = true;
  304. }
  305. },
  306. //点击编辑知识块弹窗
  307. editBlockPoint(data) {
  308. let block = data;
  309. this.editBlockPointModal = true;
  310. this.reloadMockData();
  311. },
  312. //request新增知识块
  313. handleAddBlock() {
  314. console.log(this.newBlockName);
  315. this.newBlockName = "";
  316. },
  317. //request新增知识点
  318. handleAddPoint() {
  319. console.log(this.newPointName);
  320. this.newPointName = "";
  321. },
  322. //request编辑知识块
  323. handleEditBlockPoint() {
  324. console.log(this.targetKeys3);
  325. },
  326. //request编辑知识块
  327. handleComposeBlock() {
  328. console.log(this.pointCheckedList);
  329. console.log(this.newComposeName);
  330. this.newComposeName = ""
  331. },
  332. pointClick(data) {
  333. //this.point_click_id = data.id;
  334. let list = this.pointCheckedList;
  335. if (list.indexOf(data) == -1) {
  336. list.push(data);
  337. } else {
  338. list.splice(list.indexOf(data), 1);
  339. }
  340. },
  341. getMockData() {
  342. let mockData = [];
  343. for (let i = 1; i <= 20; i++) {
  344. mockData.push({
  345. id: i,
  346. key: i.toString(),
  347. label: i.toString(),
  348. name: "知识点名称_" + this.changeNumFormat(i),
  349. termNum: i + 5,
  350. blockId: i + 1,
  351. description: "知识点名称_" + this.changeNumFormat(i)
  352. });
  353. }
  354. return mockData;
  355. },
  356. getTargetKeys() {
  357. let targetArr = [];
  358. return targetArr;
  359. },
  360. handleChange3(newTargetKeys) {
  361. this.targetKeys3 = newTargetKeys;
  362. },
  363. render3(item) {
  364. return item.label + ' - ' + item.description;
  365. },
  366. //重置数据
  367. reloadMockData() {
  368. this.data3 = this.getMockData();
  369. this.targetKeys3 = this.getTargetKeys();
  370. },
  371. //transfer Input 筛选数据
  372. filterMethod(data, query) {
  373. let val = data.label + ' - ' + data.description;
  374. return val.toUpperCase().indexOf(query.toUpperCase()) > -1;
  375. }
  376. }
  377. }
  378. </script>