You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

241 lines
7.3 KiB

5 years ago
5 years ago
  1. <template>
  2. <section>
  3. <div class="SpeListOverFlow">
  4. <draggable v-model="imageLists" :options="{group:'img'}" @start="drag=true" @end="drag=false">
  5. <el-col :span="8" v-for="(o, index) in imageLists" >
  6. <el-card :body-style="{ padding: '0px' }">
  7. <div class="avatar-uploader" @click="selectedImage(index)">
  8. <div style="height: 178px;width: 186px;display: flex;">
  9. <img v-if="getUrl(o)" :src="converUrl(o)" class="avatar">
  10. <i v-else class="el-icon-plus avatar-uploader-icon"></i>
  11. </div>
  12. </div>
  13. <span class="row-span" style="justify-content:center;align-items:center;display:flex;">
  14. <span>{{index+1}},&nbsp;</span>
  15. <span v-show="!!valueName" style="height: 35px;">{{o[valueName]}}</span>
  16. <i class="el-icon-zoom-in" @click="previewImg(index)"></i>
  17. <el-button type="text" class="button" @click="delImg(index)">删除</el-button>
  18. </span>
  19. </el-card>
  20. </el-col>
  21. </draggable>
  22. <el-col :span="8" v-if="showAdd=='true'">
  23. <el-card :body-style="{ padding: '0px' }">
  24. <div style="padding: 14px;" class="avatar-uploader" @click="addImg">
  25. <i class="el-icon-plus avatar-uploader-icon"></i>
  26. </div>
  27. </el-card>
  28. </el-col>
  29. <el-dialog title="裁剪图片" :visible.sync="shearMngVisible" top="0px" width="1100px" :lock-scroll="false" :close-on-click-modal="false" append-to-body>
  30. <shear-mng :visible="shearMngVisible" :imgWidth="imgWidth" :imgHeight="imgHeight" :image="image" :branch-id="branchId" :deptid="deptid" :category-id="image.categoryId" :remark="remark" @cancel="shearMngVisible=false" @upload-success="uploadSuccess"></shear-mng>
  31. </el-dialog>
  32. <el-dialog title="选择图片" :visible.sync="addFormVisible" width="70%" :close-on-click-modal="false" append-to-body>
  33. <upload-image :branch-id="branchId" :dept-id="deptid" :visible="addFormVisible" @cancel="addFormVisible=false" @confirm="handleConfirm"></upload-image>
  34. </el-dialog>
  35. <el-dialog :visible.sync="previewVisible" append-to-body>
  36. <img width="100%" :src="imageUrl" alt>
  37. </el-dialog>
  38. </div>
  39. </section>
  40. </template>
  41. <script>
  42. import util from '@/common/js/util';//全局公共库
  43. import UploadImage from '../UploadImage';
  44. import ShearMng from '../ShearSelectUpload';
  45. import draggable from 'vuedraggable';
  46. import config from '@/common/config';//config
  47. export default {
  48. props:['branchId','categoryId','remark','showAdd','limit','urlName','desName','value','valueName','deptid','imgWidth','imgHeight'],
  49. watch: {
  50. 'value':function(val){
  51. this.imageLists = val;
  52. },
  53. 'imageLists':function(val){
  54. this.$emit('input',val);
  55. }
  56. },
  57. data() {
  58. return {
  59. addFormVisible:false,
  60. shearMngVisible:false,
  61. /**begin 在下面加自定义属性,记得补上面的一个逗号**/
  62. image:{categoryId:''},
  63. imageUrl:'',
  64. previewVisible:false,
  65. imageLists:[],//存放图片信息的数组 {urlName:,desName:,opflag:add/del/edit,order:}
  66. selectedImgIndex:this.value.length,
  67. opflag:'',//add/del/edit
  68. /**end 在上面加自定义属性**/
  69. }//end return
  70. },//end data
  71. methods: {
  72. selectedImage(index){
  73. this.selectedImgIndex = index;//注意修改图片url后清空
  74. this.opflag='edit';
  75. this.addFormVisible = true;
  76. },
  77. handleConfirm(img){
  78. this.image=img;
  79. this.uploadSuccess(this.image)
  80. console.log(this.image);
  81. //this.shearMngVisible=true;
  82. },
  83. //上传64图片后,指定回调父组件的方法,一般用于保存该图片的信息到另一张表
  84. uploadSuccess(parm){
  85. //商品相册中,过滤添加图片和修改图片,获取图片url添加到该集合的指定url中
  86. if(this.opflag=='edit'){
  87. this.imageLists[this.selectedImgIndex][this.urlName] = parm.url; //该方式修改图片后是否不会立即显示url。
  88. //this.$emit('input',this.imageLists);
  89. this.$emit('editImg',this.imageLists[this.selectedImgIndex]);
  90. this.shearMngVisible=false;
  91. }else if(this.opflag=='add'){
  92. //在此处为添加按钮
  93. //获取添加图片的信息,并且添加,删除是同时删除数据
  94. var g={};
  95. g[this.urlName]=parm.url;
  96. if(this.desName!=null&&this.desName!=''&&this.desName!='undefined'){
  97. g[this.desName]=parm.remark;
  98. }
  99. this.imageLists.push(g);
  100. this.shearMngVisible=false;
  101. this.$emit('addImg',g);
  102. //this.$emit('input',this.imageLists);
  103. }
  104. //商品相册可以修改图片和添加图片
  105. /*this.imageUrl = this.converUrl(parm.url);
  106. this.shearMngVisible=false; */
  107. },
  108. /**begin 在下面加自定义方法,记得补上面的一个逗号**/
  109. converUrl(o){
  110. if(!o[this.urlName].indexOf('http')==0 && !o[this.urlName].indexOf('www')==0){
  111. return config.getArcImagePath()+"/"+o[this.urlName];
  112. }
  113. return o[this.urlName];
  114. },
  115. getUrl(o){
  116. if(o[this.urlName]!='' && o[this.urlName]!=undefined){
  117. return true;
  118. }
  119. return false;
  120. },
  121. previewImg(index){
  122. var o=this.imageLists[index];
  123. this.imageUrl=this.converUrl(o);
  124. this.previewVisible=true;
  125. },
  126. addImg(){
  127. if(parseInt(this.limit)<=this.imageLists.length){
  128. this.$message({showClose: true, message: "图片数量已经超过", type: 'error' });
  129. return;
  130. }
  131. this.addFormVisible = true;
  132. this.opflag='add';
  133. },
  134. delImg(index){
  135. this.$confirm('确认删除吗?', '提示', {}).then(() => {
  136. this.opflag='del';
  137. this.selectedImgIndex=index;
  138. let returnDate = this.imageLists[this.selectedImgIndex];
  139. this.imageLists.splice(this.selectedImgIndex,1);
  140. this.$emit('delImg',returnDate);
  141. });
  142. }
  143. /**end 在上面加自定义方法**/
  144. },//end method
  145. components: {
  146. //在下面添加其它组件 'image-edit':ImageEdit
  147. 'upload-image':UploadImage,
  148. 'shear-mng':ShearMng,
  149. draggable
  150. },
  151. mounted() {
  152. this.imageLists = this.value;
  153. }
  154. }
  155. </script>
  156. <style scoped="scoped">
  157. /*
  158. 1imageList的url,获取list遍历装载list的url
  159. 2addImg方法
  160. */
  161. .avatar-uploader{
  162. border: 1px dashed #d9d9d9;
  163. border-radius: 6px;
  164. cursor: pointer;
  165. position: relative;
  166. overflow: hidden;
  167. width: 208px;
  168. height: 200px;
  169. padding-left: 10px;
  170. padding-right: 10px;
  171. padding-top: 10px;
  172. padding-bottom: 10px;
  173. }
  174. .avatar-uploader:hover {
  175. border-color: #409EFF;
  176. }
  177. .avatar-uploader-icon {
  178. font-size: 28px;
  179. color: #8c939d;
  180. width: 178px;
  181. height: 178px;
  182. line-height: 178px;
  183. text-align: center;
  184. }
  185. .avatar {
  186. max-height: 100%;
  187. max-width: 100%;
  188. margin: auto;
  189. display: block;
  190. }
  191. /* card图片 */
  192. .time {
  193. font-size: 13px;
  194. color: #999;
  195. }
  196. .bottom {
  197. margin-top: 13px;
  198. line-height: 12px;
  199. }
  200. .button {
  201. padding: 0;
  202. float: right;
  203. }
  204. .el-col-8 {
  205. width: 210px;
  206. margin-right: 10px;
  207. }
  208. .el-row{
  209. padding-left: 70px;
  210. }
  211. .row-span{
  212. font-size: 14px;
  213. color: #5a5e66;
  214. text-align: center;
  215. display:block;
  216. }
  217. /* .row-span:before{
  218. content: '*';
  219. color: #fa5555;
  220. margin-right: 4px;
  221. } */
  222. .el-icon-zoom-in:hover{
  223. color: #0043ff;
  224. }
  225. .avatar-uploader img{
  226. cursor: pointer;
  227. transition: all 0.6s;
  228. }
  229. .avatar-uploader img:hover{
  230. transform: scale(1.2);
  231. }
  232. .SpeListOverFlow{
  233. overflow-y: auto;
  234. max-height: 550px;
  235. }
  236. </style>