info.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. <template>
  2. <div class="main">
  3. <div class="search-term">
  4. <el-form class="demo-form-inline" label-width="100" :inline="true">
  5. <el-form-item label="页面" prop="username">
  6. <el-select v-model="nodeId" clearable>
  7. <el-option v-for="(item,index) in nodeList"
  8. :value="item.nodeId" :key="index" :label="item.title"></el-option>
  9. </el-select>
  10. </el-form-item>
  11. <el-form-item label="类型" prop="type">
  12. <el-select v-model="searchInfo.type" clearable>
  13. <el-option v-for="(item,index) in typeList"
  14. :value="item"
  15. :key="index"
  16. :label="item">
  17. </el-option>
  18. </el-select>
  19. </el-form-item>
  20. <el-form-item label="搜索" prop="content">
  21. <el-input v-model="searchInfo.content" clearable> </el-input>
  22. </el-form-item>
  23. <el-form-item >
  24. <el-button @click="createPaperItem" type="primary">添加内容</el-button>
  25. <el-button @click="flushAll" type="primary">刷新</el-button>
  26. </el-form-item>
  27. </el-form>
  28. </div>
  29. <el-table :data="tableData.slice( page*size-size, page*size)" border highlight-current-row style="width: 100%;margin-top:20px;">
  30. <el-table-column prop="id" label="序号" width="50"></el-table-column>
  31. <el-table-column prop="parentId" label="父节点" width="50"></el-table-column>
  32. <el-table-column prop="type" label="类型" width="60"></el-table-column>
  33. <!-- <el-table-column prop="image" label="图片地址"></el-table-column> -->
  34. <el-table-column prop="style" label="样式"></el-table-column>
  35. <!-- <el-table-column prop="preview" label="预览" width="50"></el-table-column> -->
  36. <el-table-column prop="desc" label="描述">
  37. <template slot-scope="{ row }">
  38. <div v-html="row.desc" style="height: 50px;text-overflow: ellipsis;overflow: hidden;"> </div>
  39. </template>
  40. </el-table-column>
  41. <el-table-column prop="text" label="文本或json">
  42. <template slot-scope="{ row }">
  43. <div v-html="row.text||row.content" style="height: 50px;text-overflow: ellipsis;overflow: hidden;"> </div>
  44. </template>
  45. </el-table-column>
  46. <!-- <el-table-column prop="video" label="视频" ></el-table-column> -->
  47. <!-- <el-table-column prop="poster" label="视频图片" ></el-table-column> -->
  48. <el-table-column prop="marks" label="图片文字" >
  49. <template slot-scope="{ row }">
  50. <div v-html="row.marks"> </div>
  51. </template>
  52. </el-table-column>
  53. <el-table-column prop="link" label="链接" width="50"></el-table-column>
  54. <el-table-column prop="orderId" label="排序" width="50"></el-table-column>
  55. <el-table-column
  56. align="center"
  57. width="160px"
  58. label="操作"
  59. class-name="small-padding fixed-width"
  60. >
  61. <template slot-scope="{row, $index}">
  62. <el-button
  63. type="primary"
  64. size="small"
  65. icon="el-icon-edit"
  66. @click="initEdit(row)"
  67. >编辑</el-button>
  68. <el-button
  69. type="danger"
  70. size="small"
  71. icon="el-icon-delete"
  72. @click="deleteRow(row)"
  73. >删除</el-button>
  74. </template>
  75. </el-table-column>
  76. </el-table>
  77. <el-pagination :current-page="page"
  78. :page-size="size"
  79. :page-sizes="[10,20, 50, 100]"
  80. :total="tableData.length"
  81. @current-change="(page)=>{this.page= page}"
  82. @size-change="(size)=>{this.size= size}"
  83. layout="total, sizes, prev, pager, next, jumper">
  84. </el-pagination>
  85. <el-dialog title="编辑内容" center :visible.sync="dialogItem" width="800px">
  86. <el-form :model="form" :rules="rules" label-width="100px" ref="elForm">
  87. <el-row>
  88. <el-col :span="12">
  89. <el-form-item label="类型" prop="type">
  90. <el-select v-model="form.type" clearable>
  91. <el-option v-for="(item,index) in typeList"
  92. :value="item"
  93. :key="index"
  94. :label="item">
  95. </el-option>
  96. </el-select>
  97. </el-form-item>
  98. </el-col>
  99. <el-col :span="12">
  100. <el-form-item label="父节点" prop="parentId">
  101. <el-select v-model="form.parentId" clearable>
  102. <el-option v-for="(item,index) in tableData"
  103. :value="item.id"
  104. :key="index"
  105. :label="item.id">
  106. </el-option>
  107. </el-select>
  108. </el-form-item>
  109. </el-col>
  110. <el-col :span="24">
  111. <el-form-item label="json文本" prop="content">
  112. <el-input v-model="form.content" style="width: 600px;" type="textarea"/>
  113. </el-form-item>
  114. </el-col>
  115. <el-col :span="24" v-if="form.type=='image'">
  116. <el-form-item label="图片地址" prop="parentId">
  117. <el-input v-model="form.image" style="width: 600px;"/>
  118. </el-form-item>
  119. </el-col>
  120. <el-col :span="24" v-if="form.type=='video'">
  121. <el-form-item label="视频地址" prop="video">
  122. <el-input v-model="form.video" style="width: 600px;"/>
  123. </el-form-item>
  124. </el-col>
  125. <el-col :span="24" v-if="form.type=='video'">
  126. <el-form-item label="视频图片" prop="poster">
  127. <el-input v-model="form.poster" style="width: 600px;"/>
  128. </el-form-item>
  129. </el-col>
  130. <el-col :span="24" v-if="form.type=='table-texts'">
  131. <el-form-item label="表格数据" prop="desc">
  132. <el-input v-model="form.desc" style="width: 600px;" type="textarea" placeholder="|分列;分行"/>
  133. </el-form-item>
  134. </el-col>
  135. <el-col :span="24">
  136. <el-form-item label="样式" prop="style">
  137. <el-select @change="(item)=>{form.style= item}" clearable>
  138. <el-option v-for="(item,index) in paperStyleList"
  139. :value="item.style"
  140. :key="index"
  141. :label="item.name">
  142. </el-option>
  143. </el-select>
  144. <el-input v-model="form.style" style="width: 600px;" type="textarea"/>
  145. </el-form-item>
  146. </el-col>
  147. <el-col :span="24">
  148. <el-form-item label="图片文字" prop="marks">
  149. <el-input v-model="form.marks" style="width: 600px;" type="textarea"/>
  150. </el-form-item>
  151. </el-col>
  152. <el-col :span="8">
  153. <el-form-item label="链接" prop="link">
  154. <el-input v-model.number="form.link" type="number" style="width: 100px;"/>
  155. </el-form-item>
  156. </el-col>
  157. <el-col :span="8">
  158. <el-form-item label="是否预览" prop="marks">
  159. <el-switch :active-value="1" :inactive-value="0" v-model="form.preview"
  160. style="width: 100px;"
  161. ></el-switch>
  162. </el-form-item>
  163. </el-col>
  164. <el-col :span="8">
  165. <el-form-item label="排序" prop="orderId">
  166. <el-input v-model.number="form.orderId" type="number" style="width: 100px;"/>
  167. </el-form-item>
  168. </el-col>
  169. <el-col :span="24">
  170. <el-form-item label="文本" prop="text">
  171. <el-input v-model="form.text" style="width: 600px;" type="textarea"/>
  172. </el-form-item>
  173. </el-col>
  174. </el-row>
  175. </el-form>
  176. <div class="dialog-footer" slot="footer">
  177. <el-button @click="dialogItem = false">取 消</el-button>
  178. <el-button @click="addPaperItem" type="primary">确 定</el-button>
  179. </div>
  180. </el-dialog>
  181. </div>
  182. </template>
  183. <script>
  184. import BImage from '@/components/upload/BImage.vue'
  185. import Inode from './components/Inode.vue'
  186. import { tow60 } from "@/utils/stringFun";
  187. import { getPaper, addPaper, addPaperItem, getPaperStyle,delPaperItem } from "@/api/paper";
  188. const getTitle = function(item){
  189. return item.text||item.marks||item.desc||(''+item.id);
  190. }
  191. const gbForm = {
  192. children: [],desc: "",id: 0,preview: 0,style:'',text:'',type:'',video:'',content:'',
  193. image: "", link: 0,marks: "",nodeId: "main",orderId: 0,parentId: 0,poster: "",isJson:0
  194. }
  195. export default {
  196. name: 'application',
  197. data() {
  198. return {
  199. tow60,
  200. loading:false,
  201. id:0,
  202. page:1,
  203. size:10,
  204. getTitle,
  205. form: Object.assign({}, gbForm),
  206. typeList:['image','title','text','form','form-input','form-radio','form-datetime','video','slider','matrix','tabs','table-texts','bold-text'],
  207. dialogItem: false,
  208. nodeId:'main',
  209. children: [],
  210. nodeList: [],
  211. tableData:[],
  212. paperStyleList:[],
  213. searchInfo:{
  214. type:'',
  215. content:'',
  216. },
  217. rules: {
  218. type: [{ required: true, message: "请选择类型", trigger: "blur" }],
  219. }
  220. }
  221. },
  222. components:{BImage,Inode},
  223. created(){
  224. this.id = +this.$route.query.id;
  225. if( this.id ){
  226. this.loadData( )
  227. }
  228. this.getPaperStyle()
  229. },
  230. watch:{
  231. nodeId(){
  232. this.filterData()
  233. },
  234. searchInfo:{
  235. handler(new_value,old_value){
  236. this.page = 1;
  237. this.filterData();
  238. },
  239. deep: true,
  240. }
  241. },
  242. methods:{
  243. flushAll(){
  244. this.loadData( )
  245. this.getPaperStyle()
  246. },
  247. initEdit(row ){
  248. this.form = Object.assign( this.form, row );
  249. this.form.nodeId = this.nodeId;
  250. this.form.paperId = this.id;
  251. this.dialogItem = true;
  252. },
  253. createPaperItem(){
  254. this.form = Object.assign(this.form, gbForm)
  255. this.dialogItem = true;
  256. let orderId = -1;
  257. this.tableData.forEach(item=>{
  258. if(item.orderId>orderId) orderId= item.orderId;
  259. });
  260. this.form.orderId = orderId+1;
  261. },
  262. loadData( ){
  263. let id = this.id;
  264. getPaper({id}).then(res => {
  265. if (res.code == 200) {
  266. this.info = res.data;
  267. this.children = res.data.children||[];
  268. let nodeList =[{nodeId:'main', title:'主页'}];
  269. for( let i in this.children){
  270. let item = this.children[i];
  271. if( item.link>0) {
  272. nodeList.push( {nodeId: item.link, title:getTitle(item)})
  273. }
  274. }
  275. this.nodeList = nodeList;
  276. this.filterData();
  277. }
  278. })
  279. },
  280. filterData(){
  281. let nodeId = this.nodeId||'main';
  282. let {type, content}= this.searchInfo;
  283. this.tableData = this.children.filter( item =>{
  284. if( item.nodeId != nodeId) return false;
  285. if( type && item.type != type) return false;
  286. if( content){
  287. let allcontent = item.text + item.marks + item.desc;
  288. if(allcontent.indexOf(content)==-1) return false;
  289. }
  290. return true
  291. })
  292. },
  293. addPaperItem(){
  294. let param = Object.assign({}, this.form);
  295. param.orderId = +param.orderId;
  296. param.link = +param.link;
  297. param.paperId = this.id;
  298. param.nodeId = ''+this.nodeId;
  299. this.$refs["elForm"].validate((valid) => {
  300. if (!valid) return;
  301. addPaperItem( param).then( res=>{
  302. if( res.code != 200) return;
  303. this.$message.successMsg("添加成功", 2);
  304. this.dialogItem = false;
  305. this.loadData();
  306. })
  307. })
  308. },
  309. deleteRow( row ){
  310. let param = {id:row.id}
  311. delPaperItem( param).then( res=>{
  312. if( res.code != 200) return;
  313. this.$message.successMsg("移除", 2);
  314. this.loadData();
  315. })
  316. },
  317. getPaperStyle(){
  318. getPaperStyle({}).then( res=>{
  319. this.paperStyleList = res.data||[]
  320. })
  321. }
  322. }
  323. }
  324. </script>
  325. <style>
  326. @import url("../../style/paper.css");
  327. .ipt-select{
  328. width: 500px;
  329. }
  330. </style>