projectChange.vue 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272
  1. <template>
  2. <view class="content">
  3. <view class="param">
  4. <view class="all-text">创建项目需求</view>
  5. <view class="proName">项目标题</view>
  6. <input class="proINname" v-model="data.projectName" placeholder="请输入项目标题"/>
  7. <view class="proMiao">项目描述</view>
  8. <textarea class="proINname proIMi" v-model="data.projectContent" placeholder="请输入项目描述"/>
  9. <view class="proMiao">附件</view>
  10. <view class="upload-img">
  11. <uni-file-picker limit="3" :maxMb="2"
  12. @select='selectUpload'
  13. @delete="deleteHandle"
  14. :auto-upload='false'
  15. file-extname='pdf,docx,jpg,png,jpeg,doc,docm,dot,dotm,dotx,xlsx,xls,csv,xlsm,slxb,xlt,xltx'
  16. file-mediatype="all"
  17. @success='uploadSuccess'
  18. @fail='uploadFail'
  19. :list-styles='listStyles'
  20. v-model='fileList'
  21. ></uni-file-picker>
  22. </view>
  23. <span style="margin: 20rpx 0 0 20rpx;">支持pdf,docx,jpg,png,jpeg,doc,docm,dot,dotm,dotx,xlsx,xls,csv,xlsm,slxb,xlt,xltx格式,单个文件大小不超过2MB</span>
  24. <view class="proMiao">主办单位/主办人</view>
  25. <uni-data-picker placeholder="请选择主办单位" popup-title="请选择主办人" :localdata="range" v-model="value"
  26. @change="onchange" @nodeclick="onnodeclick" @popupopened="onpopupopened" @popupclosed="onpopupclosed">
  27. </uni-data-picker>
  28. <view class="proINname" style="height: 100%;">
  29. <view v-if="userListSelectwei1.length>0" class="tag-view" v-for="(value,key) in userListSelectwei1" :key="key" @click="clearTagAdminwei1(value)">
  30. <uni-tag :text="value.value+'/'+value.text[key]" type="primary" ></uni-tag>
  31. <uni-icons class="clearBtn" type="clear" size="15" color="#ccc" />
  32. </view>
  33. <view v-if="userListSelectwei1.length==0" class="tag-view" v-for="(value,key) in userListSelect1" :key="key" @click="clearTagAdmin1(value)">
  34. <uni-tag :text="value.parent_value.organize+'/'+value.text" type="primary" ></uni-tag>
  35. <!-- {{value.parent_value.organize}}/{{value.text}} -->
  36. <uni-icons class="clearBtn" type="clear" size="15" color="#ccc" />
  37. </view>
  38. </view>
  39. <!-- <view class="proMiao">主办单位</view>
  40. <uni-data-select class="proINname"
  41. v-model="value" placeholder="请选择主办单位"
  42. :localdata="range"
  43. @change="change"
  44. ></uni-data-select>
  45. <view class="proMiao">主办人</view>
  46. <uni-data-select class="proINname"
  47. v-model="peopleValue" placeholder="请选择主办人"
  48. :localdata="rangePeople"
  49. @change="change"
  50. ></uni-data-select> -->
  51. <view class="proMiao">协办单位/协办人</view>
  52. <uni-data-picker placeholder="请选择协办单位" popup-title="请选择协办人" :showSearch= "true" :localdata="range" v-model="value2"
  53. @change="onchange2" @nodeclick="onnodeclick2" @popupopened="onpopupopened2" @popupclosed="onpopupclosed2">
  54. </uni-data-picker>
  55. <view class="proINname" style="height: 100%;">
  56. <view v-if="userListSelectwei.length>0" class="tag-view" v-for="(value,key) in userListSelectwei" :key="key" @click="clearTagAdminwei(value)">
  57. <uni-tag :text="value.value+'/'+value.text[key]" type="primary" ></uni-tag>
  58. <uni-icons class="clearBtn" type="clear" size="15" color="#ccc" />
  59. </view>
  60. <view v-if="userListSelectwei.length==0" class="tag-view" v-for="(value,key) in userListSelect" :key="key" @click="clearTagAdmin(value)">
  61. <uni-tag :text="value.parent_value.organize+'/'+value.text" type="primary" ></uni-tag>
  62. <!-- {{value.parent_value.organize}}/{{value.text}} -->
  63. <uni-icons class="clearBtn" type="clear" size="15" color="#ccc" />
  64. </view>
  65. </view>
  66. <!-- <view class="proMiao">协办单位</view>
  67. <mySelectCheckbox class="proINname" placeholder="请选择协办单位" v-model="value2" multiple dataKey="label" dataValue="value" :localdata="data2"
  68. @change="changeXie"></mySelectCheckbox>
  69. <view class="proMiao">协办人</view>
  70. <mySelectCheckbox class="proINname" placeholder="请选择协办人" v-model="peopleValue2" multiple dataKey="label" dataValue="value" :localdata="dataPeople"
  71. @change="changeXiePeo"></mySelectCheckbox> -->
  72. <view class="proMiao">项目级别</view>
  73. <uni-data-select class="proINname"
  74. v-model="jibieValue" placeholder="请选择项目级别"
  75. :localdata="jibie"
  76. @change="change"
  77. ></uni-data-select>
  78. <view class="proMiao">项目来源</view>
  79. <uni-data-select class="proINname"
  80. v-model="fromValue" placeholder="请选择项目来源"
  81. :localdata="from"
  82. @change="change"
  83. ></uni-data-select>
  84. <view class="proMiao">项目评分人</view>
  85. <uni-combox class="proINname"
  86. :scorePeople="scorePeople" labelKey="label" valueKey="value"
  87. placeholder="请选择项目评分人"
  88. v-model="peoplescore"
  89. @input="comboxInput"
  90. ></uni-combox>
  91. </uni-forms-item>
  92. <view class="proINname" style="height: 100%;">
  93. <view v-if="userListSelectweiP.length>0" class="tag-view" v-for="(value,key) in userListSelectweiP" :key="key" @click="clearTagAdminweiP(value)">
  94. <uni-tag :text="value.text" type="primary" ></uni-tag>
  95. <uni-icons class="clearBtn" type="clear" size="15" color="#ccc" />
  96. </view>
  97. <view v-if="userListSelectweiP.length==0" class="tag-view" v-for="(value,key) in scorePeople22" :key="key" @click="clearTagAdminP(value)">
  98. <uni-tag :text="value" type="primary" ></uni-tag>
  99. <!-- {{value.parent_value.organize}}/{{value.text}} -->
  100. <uni-icons class="clearBtn" type="clear" size="15" color="#ccc" />
  101. </view>
  102. </view>
  103. <view class="proMiao jindu">完成进度</view>
  104. <view class="weidu">维度权重{{weidu}}%</view>
  105. <view class="addRen" @click="addRen" v-if="crerenwu==1&& (select==5 || select==3)">新增任务</view>
  106. <!-- 任务列表 -->
  107. <view style="width: 100%;margin: 50rpx 0 0 20rpx;">
  108. <view class="renwu" v-for="(item,index) in renwu" :key="index" @click="clickRenwu(item)">
  109. <view>{{item.taskName}}</view>
  110. <view>{{item.createTime}}</view>
  111. <view v-if="item.finishTime!=null">{{item.finishRemark}}</view>
  112. <view v-if="gengrenwu==1">{{item.weight}}</view>
  113. <view v-if="item.state==1">已完成</view>
  114. <view style="color: rgba(0, 97, 255, 1);" @click.stop="updateJin(item)" v-if="gengrenwu==1&& (select==5 || select==3|| select==4)">更新进度</view>
  115. <view style="color: rgba(0, 97, 255, 1);" @click.stop="cuirenwu2(item)" v-if="cuirenwu==1">催办</view>
  116. <view style="display: flex;">
  117. <view class="renwu-bu bianji" v-if="item.finishTime==null&&uprenwu==1&& (select==5 || select==3)" @click.stop="bianjiRenwu(item)">编辑</view>
  118. <view class="renwu-bu delete" @click.stop="deleteRenwu(item)" v-if="delerenwu==1&& (select==5 || select==3)">删除</view>
  119. </view>
  120. </view>
  121. </view>
  122. <!-- <view style="width: 100%;margin: 50rpx 0 0 20rpx;">
  123. <view class="renwu" v-for="(item,index) in renwu" :key="index">
  124. <view>{{item.taskName}}</view>
  125. <view>{{item.createTime}}</view>
  126. <view>{{item.weight}}</view>
  127. <view>{{item.scoreLimit}}</view>
  128. <view style="color: rgba(0, 97, 255, 1);" @click="updateJin(item)" v-if="gengrenwu==1">更新进度</view>
  129. <view style="color: rgba(0, 97, 255, 1);" @click="cuirenwu(item)" v-if="cuirenwu==1">催办</view>
  130. </view>
  131. </view> -->
  132. <view class="proMiao jindu" v-if="data.progress>0">进度详情</view>
  133. <!-- 进度 -->
  134. <view style="margin: 33rpx 0 0 19rpx;" v-if="data.progress>0">
  135. <view v-for="(item,index) in 5" :key="index" class="jindu-kuang">
  136. <view style="display: flex;">
  137. <view class="jindu-circle"></view>
  138. <view>
  139. <view style="width: 600rpx;display: flex;justify-content: space-between;margin-top: 20rpx;">
  140. <view style="display: flex;">
  141. <view style="margin-left: 28rpx;">{{item.createName}}</view>
  142. <view class="jindu-type lixiang">{{item.content}}</view>
  143. </view>
  144. <!-- <view class="jindu-type cuiban">已催办</view>
  145. <view class="jindu-type tijiao">已提交</view> -->
  146. <view>{{item.createTime}}</view>
  147. </view>
  148. <view style="margin:7rpx 0 0 28rpx;">项目名:{{item.projectName}}</view>
  149. </view>
  150. </view>
  151. <!-- <view class="jindu-line" v-if="index<4"></view> -->
  152. </view>
  153. </view>
  154. <view class="project">
  155. <view class="butt queren" @click="updatePro">保存</view>
  156. </view>
  157. <view style="width: 100%;height: 60rpx;"></view>
  158. </view>
  159. <!-- 图片压缩 -->
  160. <Compress ref="Compress" />
  161. </view>
  162. </template>
  163. <script>
  164. import configdata from '@/common/config.js'
  165. import mySelectCheckbox from '../../components/my-selectCheckbox.vue'
  166. // 引入压缩组件
  167. import Compress from '@/components/compress/compress.vue'
  168. export default {
  169. components:{
  170. mySelectCheckbox,
  171. Compress
  172. },
  173. data() {
  174. return {
  175. data:{},
  176. //主办单位
  177. value: '1-2',
  178. range: [],
  179. //主办人
  180. peopleValue:'',
  181. rangePeople:[],
  182. userListSelect1:[],
  183. userListSelectwei1:[
  184. {value:'',text:''},
  185. ],
  186. //协办
  187. value2:'',
  188. userListSelect:[],
  189. userListSelectwei:[
  190. {value:'',text:''},
  191. ],
  192. data2: [],
  193. xieban:[],//协办传入值数组
  194. xieValue:[],//协办传入id
  195. //协办人
  196. peopleValue2:[],
  197. dataPeople: [],
  198. xiebanPeople:[],//协办传入值数组
  199. xieValuePeople:[],//协办传入id
  200. //评分人
  201. peoplescore:[],
  202. scorePeople: [],
  203. scorePeople22:[],//协办传入值数组
  204. userListSelectweiP:[],
  205. scoreValuePeople:[],//协办传入id
  206. // 项目级别
  207. jibieValue:0,
  208. jibie:[
  209. { value: 0, text: "正常" },
  210. { value: 1, text: "紧急" },
  211. ],
  212. // 项目来源
  213. fromValue:0,
  214. from:[
  215. { value: 0, text: "涉内" },
  216. { value: 1, text: "涉外" },
  217. ],
  218. fileList: [],
  219. fileList2: [],
  220. fileList22:'',
  221. // fileList: [
  222. // {name:'111'},
  223. // {name:'333'}
  224. // ],
  225. listStyles: {
  226. "borderStyle": {
  227. "width": "0", // 边框宽度
  228. },
  229. "border": false, // 是否显示边框
  230. "dividline": false
  231. },
  232. renwu:[],
  233. weidu:'',
  234. crerenwu:1,//添加任务
  235. uprenwu:1,//修改任务
  236. delerenwu:1,//是否删除任务
  237. cuirenwu:1,//催办任务
  238. gengrenwu:1,//是否更新任务
  239. select:0,//状态
  240. }
  241. },
  242. onShow() {
  243. // console.log('aa',sessionStorage.getItem("crerenwu"))
  244. this.crerenwu=sessionStorage.getItem("crerenwu")
  245. this.uprenwu=sessionStorage.getItem("uprenwu")
  246. this.delerenwu=sessionStorage.getItem("delerenwu")
  247. this.cuirenwu=sessionStorage.getItem("cuirenwu")
  248. this.gengrenwu=sessionStorage.getItem("gengrenwu")
  249. this.getPeopleZhu()
  250. },
  251. onLoad(option) {
  252. this.select=option.select
  253. console.log(JSON.parse(decodeURIComponent(option.data)))
  254. var wei=JSON.parse(decodeURIComponent(option.weidu))
  255. this.data=JSON.parse(decodeURIComponent(option.data))
  256. this.weidu=(wei[2].configValue)
  257. // this.getDanwei()
  258. this.getPeople(this.data.organize)
  259. for(var i=0;i<this.jibie.length;i++){
  260. if(this.jibie[i].text==this.data.projectLevel){
  261. this.jibieValue=this.jibie[i].value
  262. }
  263. }
  264. for(var i=0;i<this.from.length;i++){
  265. if(this.from[i].text==this.data.projectFrom){
  266. this.fromValue=this.from[i].value
  267. }
  268. }
  269. var image=[]
  270. image=this.data.fileUrl.split(',')
  271. this.fileList =image.map(item =>{
  272. return {
  273. name: item
  274. }
  275. })
  276. this.fileList2=image
  277. this.fileList22=image.join(",")
  278. console.log(this.fileList)
  279. this.getRenwu()
  280. console.log(this.data.coOrganize.split(','))
  281. // this.userListSelect=
  282. this.userListSelectwei=[]
  283. this.userListSelectwei1=[]
  284. this.userListSelectweiP=[]
  285. var zhuban=[]
  286. var zhubanpeo=[]
  287. var zhubanV=[]
  288. zhuban=this.data.organize.split(',')
  289. zhubanpeo=this.data.sposonerName.split(',')
  290. zhubanV=this.data.sposoner.split(',')
  291. this.userListSelectwei1=zhuban.map(item =>{
  292. console.log(item)
  293. return {
  294. value: item,
  295. text:zhubanpeo,
  296. id:zhubanV
  297. }
  298. })
  299. var xieban=[]
  300. var xiebanpeo=[]
  301. var xiebanV=[]
  302. xieban=this.data.coOrganize.split(',')
  303. xiebanpeo=this.data.coSposonerName.split(',')
  304. xiebanV=this.data.coSposoner.split(',')
  305. this.userListSelectwei=xieban.map(item =>{
  306. console.log(item)
  307. return {
  308. value: item,
  309. text:xiebanpeo,
  310. id:xiebanV
  311. }
  312. })
  313. var pingpeo=[]
  314. var pingId=[]
  315. pingpeo=this.data.scorerName.split(',')
  316. pingId=this.data.scorer.split(',')
  317. this.userListSelectweiP=pingpeo.map(item =>{
  318. return {
  319. value: pingId,
  320. text:item,
  321. }
  322. })
  323. // for(var i=0;i<xieban.length;i++){
  324. // // for(var j=0;j<xiebanpeo.length;j++){
  325. // // this.userListSelectwei.push({value:xieban[0]},{text:xiebanpeo[0]})
  326. // // }
  327. // }
  328. // this.userListSelectwei.push({value:xieban[0]},{text:xiebanpeo[0]})
  329. // xieban.map(item =>{
  330. // tt.push({value:item})
  331. // // return {
  332. // // value: item2,
  333. // // text: item,
  334. // // }
  335. // })
  336. // this.userListSelectwei=tt
  337. console.log(this.userListSelectweiP,'t')
  338. // xiebanpeo.map(item =>{
  339. // this.userListSelectwei.push({text:item})
  340. // // return {
  341. // // value: item2,
  342. // // text: item,
  343. // // }
  344. // })
  345. // this.userListSelectwei=xiebanpeo.map(item =>{
  346. // return {
  347. // value: item,
  348. // }
  349. // })
  350. // this.userListSelectwei.push(xieban,xiebanpeo)
  351. console.log(this.userListSelectwei,'p')
  352. },
  353. methods: {
  354. change(e) {
  355. console.log("e:", e);
  356. },
  357. //主办人
  358. onnodeclick(data) {
  359. console.log(data);
  360. if(data.parent_value){//存在父级
  361. let dataId = data.value;
  362. this.userListSelect1.push(data);
  363. this.userListSelect1 = [...new Set(this.userListSelect1)]//es6数组去重
  364. this.userListSelectwei1=[]
  365. }
  366. console.log(this.userListSelectwei1,'多选',this.userListSelect1)
  367. },
  368. onpopupopened(e) {
  369. console.log('popupopened');
  370. },
  371. onpopupclosed(e) {
  372. console.log('popupclosed');
  373. },
  374. onchange(e) {
  375. console.log('---------onchange:', e);
  376. var acc=e.detail.value[0].text
  377. this.getPeople(acc)
  378. },
  379. //主办人
  380. clearTagAdmin(value){
  381. this.userListSelect1 = this.userListSelect1.filter(item => item != value);
  382. },
  383. clearTagAdminwei(value){
  384. this.userListSelectwei1 = this.userListSelectwei1.filter(item => item != value);
  385. },
  386. //协办人
  387. clearTagAdmin(value){
  388. this.userListSelect = this.userListSelect.filter(item => item != value);
  389. },
  390. clearTagAdminwei1(value){
  391. this.userListSelectwei = this.userListSelectwei.filter(item => item != value);
  392. },
  393. onnodeclick2(data) {
  394. console.log(data);
  395. if(data.parent_value){//存在父级
  396. let dataId = data.value;
  397. this.userListSelect.push(data);
  398. this.userListSelect = [...new Set(this.userListSelect)]//es6数组去重
  399. this.userListSelectwei=[]
  400. }
  401. console.log(this.userListSelectwei,'多选',this.userListSelect)
  402. },
  403. onpopupopened2(e) {
  404. console.log('popupopened');
  405. },
  406. onpopupclosed2(e) {
  407. console.log('popupclosed');
  408. },
  409. onchange2(e) {
  410. console.log('---------onchange:', e);
  411. },
  412. // @input combox输入事件 返回combox值
  413. comboxInput(e) {
  414. console.log('e:', e);
  415. // this.peoplescore=e
  416. // this.scorePeople22=[]
  417. // this.scoreValuePeople=[]
  418. for(var i=0;i<this.scorePeople.length;i++){
  419. if(e==this.scorePeople[i].value){
  420. this.userListSelectweiP=[]
  421. this.scorePeople22.push(this.scorePeople[i].label)
  422. this.scoreValuePeople.push(this.scorePeople[i].value)
  423. }
  424. }
  425. console.log(this.scorePeople22)
  426. },
  427. clearTagAdminP(value){
  428. this.scorePeople22 = this.scorePeople22.filter(item => item != value);
  429. },
  430. clearTagAdminweiP(value){
  431. this.userListSelectweiP = this.userListSelectweiP.filter(item => item != value);
  432. },
  433. //新增任务
  434. addRen(){
  435. var shuzu=[
  436. {userName:'',department:'',id:''}
  437. ]
  438. var xieban=[]
  439. var xiebanpeo=[]
  440. var tt=[]
  441. var xiebanV=[]
  442. var a1=this.data.sposonerName+','+this.data.coSposonerName
  443. var a2=this.data.organize+','+this.data.coOrganize
  444. var a3=this.data.sposoner+','+this.data.coSposoner
  445. xieban=a1.split(',')
  446. xiebanpeo=a2.split(',')
  447. xiebanV=a3.split(',')
  448. shuzu=xieban.map(item =>{
  449. console.log(item)
  450. return {
  451. userName: item,
  452. }
  453. })
  454. shuzu.forEach((item,index) => {
  455. console.log(item);
  456. this.$set(item,"department",xiebanpeo[index])
  457. this.$set(item,"id",xiebanV[index])
  458. })
  459. let t2=JSON.stringify(shuzu)
  460. //这里———————————————————————————
  461. let query2 = encodeURIComponent(t2)
  462. uni.navigateTo({
  463. url:'/pages/project/addRenwu?proId='+this.data.id+'&people='+query2
  464. })
  465. },
  466. //编辑任务
  467. bianjiRenwu(item){
  468. var shuzu=[
  469. {userName:'',department:'',id:''}
  470. ]
  471. var xieban=[]
  472. var xiebanpeo=[]
  473. var tt=[]
  474. var xiebanV=[]
  475. var a1=this.data.sposonerName+','+this.data.coSposonerName
  476. var a2=this.data.organize+','+this.data.coOrganize
  477. var a3=this.data.sposoner+','+this.data.coSposoner
  478. xieban=a1.split(',')
  479. xiebanpeo=a2.split(',')
  480. xiebanV=a3.split(',')
  481. shuzu=xieban.map(item =>{
  482. console.log(item)
  483. return {
  484. userName: item,
  485. }
  486. })
  487. shuzu.forEach((item,index) => {
  488. console.log(item);
  489. this.$set(item,"department",xiebanpeo[index])
  490. this.$set(item,"id",xiebanV[index])
  491. })
  492. let t2=JSON.stringify(shuzu)
  493. //这里———————————————————————————
  494. let query2 = encodeURIComponent(t2)
  495. //传参对象,使用encodeURIComponent编码
  496. let str = JSON.stringify(item)
  497. //注意这里——————————————————————
  498. str = str.replace(/%/g, '%25')
  499. //这里———————————————————————————
  500. let query = encodeURIComponent(str)
  501. uni.navigateTo({
  502. url:'/pages/project/changeRenwu?data='+query+'&people='+query2
  503. })
  504. },
  505. //删除任务
  506. deleteRenwu(item){
  507. let that = this
  508. uni.showModal({
  509. title: '提示',
  510. content: '确定删除任务吗?',
  511. success: function(res) {
  512. if (res.confirm) {
  513. console.log('用户点击确定');
  514. uni.showLoading({
  515. title: '加载中',
  516. mask: true, // 是否显示透明蒙层,防止触摸穿透
  517. });
  518. let data={
  519. id:item.id,
  520. }
  521. that.$Request.postT('/api/sysTask/del',data).then(res => {
  522. if (res.code==200) {
  523. uni.showToast({
  524. title: '删除成功',
  525. icon: 'none',
  526. duration:800
  527. });
  528. uni.hideLoading()
  529. setTimeout(function() {
  530. that.getRenwu()
  531. }, 1000)
  532. } else {
  533. uni.hideLoading();
  534. uni.showToast({
  535. title: res.message,
  536. icon: 'none',
  537. duration:800
  538. });
  539. }
  540. });
  541. } else if (res.cancel) {
  542. console.log('用户点击取消');
  543. }
  544. }
  545. })
  546. },
  547. //任务详情
  548. clickRenwu(item){
  549. var shuzu=[
  550. {userName:'',department:'',id:''}
  551. ]
  552. var xieban=[]
  553. var xiebanpeo=[]
  554. var tt=[]
  555. var xiebanV=[]
  556. var a1=this.data.sposonerName+','+this.data.coSposonerName
  557. var a2=this.data.organize+','+this.data.coOrganize
  558. var a3=this.data.sposoner+','+this.data.coSposoner
  559. xieban=a1.split(',')
  560. xiebanpeo=a2.split(',')
  561. xiebanV=a3.split(',')
  562. shuzu=xieban.map(item =>{
  563. console.log(item)
  564. return {
  565. userName: item,
  566. }
  567. })
  568. shuzu.forEach((item,index) => {
  569. console.log(item);
  570. this.$set(item,"department",xiebanpeo[index])
  571. this.$set(item,"id",xiebanV[index])
  572. })
  573. let t2=JSON.stringify(shuzu)
  574. //这里———————————————————————————
  575. let query2 = encodeURIComponent(t2)
  576. //传参对象,使用encodeURIComponent编码
  577. let str = JSON.stringify(item)
  578. //注意这里——————————————————————
  579. str = str.replace(/%/g, '%25')
  580. //这里———————————————————————————
  581. let query = encodeURIComponent(str)
  582. uni.navigateTo({
  583. url:'/pages/project/renwuX?data='+query+'&people='+query2
  584. })
  585. },
  586. //更新进度
  587. updateJin(item){
  588. //传参对象,使用encodeURIComponent编码
  589. let str = JSON.stringify(item)
  590. //注意这里——————————————————————
  591. str = str.replace(/%/g, '%25')
  592. //这里———————————————————————————
  593. let query = encodeURIComponent(str)
  594. uni.navigateTo({
  595. url:'/pages/project/renwuUpdateJin?data='+query
  596. })
  597. },
  598. //催办任务
  599. cuirenwu2(item){
  600. let that = this
  601. uni.showModal({
  602. title: '提示',
  603. content: '确定催办任务吗?',
  604. success: function(res) {
  605. if (res.confirm) {
  606. console.log('用户点击确定');
  607. uni.showLoading({
  608. title: '加载中',
  609. mask: true, // 是否显示透明蒙层,防止触摸穿透
  610. });
  611. let data={
  612. taskId:item.id,
  613. }
  614. that.$Request.postT('/api/sysTask/urge',data).then(res => {
  615. if (res.code==200) {
  616. uni.showToast({
  617. title: '催办成功',
  618. icon: 'none',
  619. duration:800
  620. });
  621. uni.hideLoading()
  622. setTimeout(function() {
  623. that.getRenwu()
  624. }, 1000)
  625. } else {
  626. uni.hideLoading();
  627. uni.showToast({
  628. title: res.message,
  629. icon: 'none',
  630. duration:800
  631. });
  632. }
  633. });
  634. } else if (res.cancel) {
  635. console.log('用户点击取消');
  636. }
  637. }
  638. })
  639. },
  640. //获取单位
  641. getDanwei(){
  642. this.range=[]
  643. this.data2=[]
  644. uni.showLoading({
  645. title: '加载中',
  646. mask: true, // 是否显示透明蒙层,防止触摸穿透
  647. });
  648. this.$Request.postT('/api/Organize/query').then(res => {
  649. if (res.code==200&&res.data) {
  650. this.range =res.data.map(item =>{
  651. return {
  652. value: item.id,
  653. text: item.oname,
  654. id:item.oid
  655. }
  656. })
  657. this.data2 =res.data.map(item =>{
  658. return {
  659. value: item.id,
  660. label: item.oname,
  661. id:item.oid
  662. }
  663. })
  664. for(var i=0;i<this.range.length;i++){
  665. if(this.range[i].text==this.data.organize){
  666. this.value=this.range[i].value
  667. }
  668. }
  669. // for(var i=0;i<this.data2.length;i++){
  670. // if(this.data2[i].label==this.data.){
  671. // this.value2=this.data2[i].value
  672. // }
  673. // }
  674. }
  675. uni.hideLoading();
  676. });
  677. },
  678. //获取主办协办人
  679. getPeopleZhu(){
  680. this.range=[]
  681. this.rangePeople=[]
  682. uni.showLoading({
  683. title: '加载中',
  684. mask: true, // 是否显示透明蒙层,防止触摸穿透
  685. });
  686. this.$Request.postJson('/api/sysProject/queryCoUsers',{}).then(res => {
  687. if (res.code==200) {
  688. var lianji=[]
  689. for(var i=0;i<res.data.length;i++){
  690. if(res.data[i].userList.length>0){
  691. lianji.push(res.data[i])
  692. }
  693. }
  694. this.range =lianji.map(item =>{
  695. return {
  696. value: item,
  697. text: item.organize,
  698. children:item.userList.map(item =>{
  699. return{
  700. value: item.id,
  701. text: item.userName,
  702. }
  703. })
  704. }
  705. })
  706. console.log(this.range,'人')
  707. this.value=parseInt(this.data.sposoner)//25
  708. this.userListSelect1={
  709. parent_value:{
  710. organize:this.data.organize
  711. }
  712. }
  713. }else{
  714. var ii=JSON.stringify(res)
  715. console.log(res,res.data)
  716. console.log(JSON.parse(res))
  717. console.log(JSON.parse(ii))
  718. }
  719. uni.hideLoading();
  720. });
  721. },
  722. //根据单位获取人员(评分人)
  723. getPeople(acc){
  724. console.log(this.userListSelect1)
  725. this.scorePeople=[]
  726. uni.showLoading({
  727. title: '加载中',
  728. mask: true, // 是否显示透明蒙层,防止触摸穿透
  729. });
  730. this.$Request.postT('/api/sysUser/queryScorer',{
  731. organizes:acc
  732. }).then(res => {
  733. if (res.code==200) {
  734. console.log(res,'评分')
  735. this.scorePeople =res.data.map(item =>{
  736. return {
  737. value: item.id,
  738. label: item.userName,
  739. }
  740. })
  741. console.log(this.scorePeople,'人')
  742. // var people=[]
  743. // people=this.data.scorerName.split(',')
  744. // for(var j=0;j<this.scorePeople.length;j++){
  745. // for(var i=0;i<people.length;i++){
  746. // console.log(this.scorePeople[j].label,'ll',people[i])
  747. // if(this.scorePeople[j].label==people[i]){
  748. // this.peoplescore.push(this.scorePeople[j].value)
  749. // this.scoreValuePeople.push(this.scorePeople[j].value)
  750. // }
  751. // }
  752. // }
  753. }else{
  754. var ii=JSON.stringify(res)
  755. console.log(res,res.data)
  756. console.log(JSON.parse(res))
  757. console.log(JSON.parse(ii))
  758. }
  759. uni.hideLoading();
  760. });
  761. },
  762. // 查找任务
  763. getRenwu(){
  764. let that = this
  765. that.renwu=[]
  766. uni.showLoading({
  767. title: '加载中',
  768. mask: true, // 是否显示透明蒙层,防止触摸穿透
  769. });
  770. var data={
  771. "projectId": that.data.id
  772. }
  773. that.$Request.postT('/api/sysTask/queryTaskByProject',data).then(res => {
  774. if (res.code==200) {
  775. that.renwu=res.data
  776. console.log(that.renwu,'任务')
  777. }
  778. uni.hideLoading();
  779. });
  780. },
  781. // 上传附件
  782. uploadSuccess(e) {
  783. console.log('上传成功', e)
  784. },
  785. uploadFail(e) {
  786. console.log('上传失败:', e)
  787. },
  788. //保存编辑项目
  789. updatePro(){
  790. console.log(this.userListSelectwei)
  791. var xieban=[]
  792. var xiebanValue=[]
  793. if(this.userListSelectwei.length>0){
  794. this.userListSelectwei.map(item =>{
  795. xieban.push(item.value)
  796. xiebanValue.push(item.id[0])
  797. })
  798. }else{
  799. this.userListSelect.map(item =>{
  800. xieban.push(item.parent_value.organize)
  801. xiebanValue.push(item.value)
  802. })
  803. }
  804. var zhuban=[]
  805. var zhubanValue=[]
  806. if(this.userListSelectwei1.length>0){
  807. this.userListSelectwei1.map(item =>{
  808. zhuban.push(item.value)
  809. zhubanValue.push(item.id[0])
  810. })
  811. }else{
  812. this.userListSelect1.map(item =>{
  813. zhuban.push(item.parent_value.organize)
  814. zhubanValue.push(item.value)
  815. })
  816. }
  817. var pinfen=[]
  818. if(this.userListSelectweiP.length>0){
  819. this.userListSelectweiP.map(item =>{
  820. pinfen.push(item.value)
  821. })
  822. }else{
  823. this.scorePeople22.map(item =>{
  824. pinfen.push(item)
  825. })
  826. }
  827. console.log(pinfen)
  828. let that = this
  829. if (!that.data.projectName) {
  830. that.$queue.showToast("请输入项目标题");
  831. }else if (!that.data.projectContent) {
  832. that.$queue.showToast("请输入项目描述");
  833. }else {
  834. uni.showLoading({
  835. title: '加载中',
  836. mask: true, // 是否显示透明蒙层,防止触摸穿透
  837. });
  838. that.$Request.postJson("/api/sysProject/update", {
  839. "id": that.data.id,
  840. "projectName": that.data.projectName, // 项目名称
  841. "projectFrom": that.from[that.fromValue].text, // 项目来源
  842. "projectLevel": that.jibie[that.jibieValue].text, // 项目等级
  843. "projectContent": that.data.projectContent, // 项目描述
  844. "fileUrl": that.fileList22, // 附件
  845. "organize": zhuban.join(","), // 主办单位-单选
  846. "sposoner": zhubanValue.join(","), // 主办人ID-单选
  847. "coOrganize": xieban.join(","), // 协办单位-多选
  848. "coSposoner": xiebanValue.join(",") ,// 协办人ID-多选
  849. "scorer": pinfen.join(",") // 评分人ID-多选
  850. }).then(res => {
  851. if (res.code == 200) {
  852. uni.showToast({
  853. title: '修改成功',
  854. icon: 'none',
  855. duration:800
  856. });
  857. uni.hideLoading()
  858. setTimeout(function() {
  859. uni.switchTab({
  860. url:'/pages/project/index'
  861. })
  862. }, 1000)
  863. } else {
  864. uni.hideLoading();
  865. uni.showToast({
  866. title: res.message,
  867. icon: 'none',
  868. duration:800
  869. });
  870. }
  871. });
  872. }
  873. },
  874. //删除文件
  875. deleteHandle(index){
  876. console.log(index)
  877. this.fileList2.splice(index.index,1)
  878. console.log(this.fileList2)
  879. this.fileList22=this.fileList2.join(",")
  880. },
  881. async selectUpload(e) {
  882. console.log('上传:', e)
  883. // console.log((e.tempFiles[0].size / 1024 > 1024 * 2),'大小')
  884. if(e.tempFiles.length>0){
  885. for (let i = 0; i < e.tempFilePaths.length; i++) {
  886. if ((e.tempFiles[i].size / 1024 > 1024 * 2)) {
  887. console.log('过大',e.tempFiles[i].extname)
  888. if(e.tempFiles[i].extname=='jpg' || e.tempFiles[i].extname=='png'||e.tempFiles[i].extname=='jpeg'){
  889. this.yaimg(e.tempFilePaths[i])
  890. }else{
  891. uni.showModal({
  892. title: '提示',
  893. content: '文件大于2M,无法上传',
  894. showCancel: false, // 是否显示取消按钮,默认为 true // 是否显示取消按钮,默认为 true
  895. success: function(res) {
  896. if (res.confirm) {
  897. }
  898. }
  899. });
  900. }
  901. }else{
  902. this.imgUpload(e.tempFiles[i].file);
  903. }
  904. }
  905. }
  906. },
  907. //上传图片
  908. async imgUpload(result){
  909. uni.showLoading({
  910. title: '上传中',
  911. mask: true, // 是否显示透明蒙层,防止触摸穿透
  912. });
  913. let data = new FormData();
  914.   data.set("file", result);
  915.   let res = await this.$axios({
  916.     method: "post",
  917.     url: this.config('APIHOST1') + "/api/sysFile/upload",
  918.     headers: {
  919. tokenW: sessionStorage.getItem("token"),
  920. "Content-Type": "multipart/form-data"
  921.     },
  922.     data: data,
  923.   });
  924. // return res
  925.   console.log(res, "图片上传成功");
  926.   if (res.data.code == 200) {
  927. console.log(this.fileList2)
  928.     this.fileList2.push(res.data.data);
  929. this.fileList22=this.fileList2.join(",")
  930. // console.log(this.fileList2.join(","))
  931. uni.hideLoading();
  932.   } else if(res.message=="登录凭证已过去,请重新登录"){
  933. sessionStorage.removeItem("token")
  934. sessionStorage.removeItem("roleId")
  935. uni.showModal({
  936. title: '提示',
  937. content: '用户信息失效,请重新登录!',
  938. showCancel: false, // 是否显示取消按钮,默认为 true // 是否显示取消按钮,默认为 true
  939. success: function(res) {
  940. if (res.confirm) {
  941. }
  942. }
  943. });
  944. uni.hideLoading();
  945. }else {
  946.     uni.showToast({
  947. title: res.message,
  948. icon: 'none',
  949. duration:800
  950. });
  951. uni.hideLoading();
  952.   }
  953. },
  954. /**
  955. * 压缩图片
  956. * @description 由组件处理,只需传入临时路径
  957. * @param {Object} url - 临时路径
  958. * @return void
  959. */
  960. yaimg(url) {
  961. uni.showLoading({
  962. title: '压缩中',
  963. mask: true, // 是否显示透明蒙层,防止触摸穿透
  964. });
  965. // 组件参数也有文档,详见文章的最底部!
  966. // const config = {
  967. // src: url,//要压缩的临时路径
  968. // maxSize: 800,//压缩后的最大尺寸
  969. // fileType: 'png',//压缩后的文件类型,可选值 jpg、png
  970. // quality: 0.6,//压缩后的质量(仅jpg类型有效,原因可自行阅读官方canvas文档),可选值 0 ~ 1,值越大越清晰(图片也越大)
  971. // }
  972. // console.log(config)
  973. // 调用压缩方法
  974. this.$refs.Compress.compress({
  975. src: url,//要压缩的临时路径
  976. maxSize: 800,//压缩后的最大尺寸
  977. fileType: '',//压缩后的文件类型,可选值 jpg、png
  978. quality: 0.6,//压缩后的质量(仅jpg类型有效,原因可自行阅读官方canvas文档),可选值 0 ~ 1,值越大越清晰(图片也越大)
  979. }).then((res) => {
  980. // console.log('返回的base64编码', res)
  981. this.base = res
  982. // 时间戳 + 随机数, 防止文件名重复
  983. let timestamp = new Date().getTime();
  984. let sunumber = Math.floor(Math.random()*999);
  985. // H5需要将base64转为file对象进行上传
  986. // 第一个参数是base64编码, 第二个是文件名
  987. var file = this.base64ToFile(res, timestamp + sunumber)
  988. // 最终压缩完毕的file对象
  989. console.log('压缩后的图片(File对象)', file)
  990. this.upload(file)
  991. this.file = file
  992. uni.hideLoading();
  993. //上传到服务器
  994. // this.upload(file)
  995. }).catch((err) => {
  996. console.log('压缩失败',err)
  997. uni.hideLoading();
  998. })
  999. },
  1000. /**
  1001. * 压缩后上传到服务器
  1002. * @description 这块需要您自行处理
  1003. * @param {Object} file - 要上传的file对象
  1004. * @return void
  1005. */
  1006. async upload(file){
  1007. uni.showLoading({
  1008. title: '上传中',
  1009. mask: true, // 是否显示透明蒙层,防止触摸穿透
  1010. });
  1011. let data = new FormData();
  1012.   data.set("file", file);
  1013. console.log(data)
  1014.   let res = await this.$axios({
  1015.     method: "post",
  1016.     url: this.config('APIHOST1') + "/api/sysFile/upload",
  1017.     headers: {
  1018. tokenW: sessionStorage.getItem("token"),
  1019. "Content-Type": "multipart/form-data"
  1020.     },
  1021.     data: data,
  1022.   });
  1023. // return res
  1024.   console.log(res, "图片上传成功",res.data.code == 200);
  1025.   if (res.data.code == 200) {
  1026.     this.fileList2.push(res.data.data);
  1027. this.fileList22=this.fileList2.join(",")
  1028. console.log(this.fileList22)
  1029. uni.hideLoading();
  1030.   }else {
  1031.     uni.showToast({
  1032. title: res.message,
  1033. icon: 'none',
  1034. duration:800
  1035. });
  1036. uni.hideLoading();
  1037.   }
  1038. },
  1039. /**
  1040. * base64 → File
  1041. * @description 转换函数
  1042. * @param {String} base64- base64完整字符串
  1043. * @param {String} name - 文件名
  1044. * @return Object
  1045. */
  1046. base64ToFile(base64, name) {
  1047. if (typeof base64 != 'string') { return; }
  1048. var arr = base64.split(',')
  1049. var type = arr[0].match(/:(.*?);/)[1]
  1050. var fileExt = type.split('/')[1]
  1051. var bstr = atob(arr[1])
  1052. var n = bstr.length
  1053. var u8arr = new Uint8Array(n)
  1054. while (n--) {
  1055. u8arr[n] = bstr.charCodeAt(n)
  1056. }
  1057. return new File([u8arr], `${name}.` + fileExt, {
  1058. type: type
  1059. })
  1060. },
  1061. config: function (name) {
  1062. var info = null
  1063. if (name) {
  1064. var name2 = name.split('.') //字符分割
  1065. if (name2.length > 1) {
  1066. info = configdata[name2[0]][name2[1]] || null
  1067. } else {
  1068. info = configdata[name] || null
  1069. }
  1070. if (info == null) {
  1071. let web_config = cache.get('web_config')
  1072. if (web_config) {
  1073. if (name2.length > 1) {
  1074. info = web_config[name2[0]][name2[1]] || null
  1075. } else {
  1076. info = web_config[name] || null
  1077. }
  1078. }
  1079. }
  1080. }
  1081. return info
  1082. },
  1083. }
  1084. }
  1085. </script>
  1086. <style>
  1087. .content {
  1088. display: flex;
  1089. flex-direction: column;
  1090. align-items: center;
  1091. justify-content: center;
  1092. }
  1093. .param{
  1094. margin: 20rpx 0 0 0;
  1095. width: 100%;
  1096. background-color: rgba(255, 255, 255, 1);
  1097. font-size: 28rpx;
  1098. font-weight: 400;
  1099. line-height: 41rpx;
  1100. color: rgba(0, 0, 0, 1);
  1101. }
  1102. .all-text{
  1103. margin: 22rpx 0 0 20rpx;
  1104. font-size: 32rpx;
  1105. font-weight: 500;
  1106. color: rgba(0, 0, 0, 1);
  1107. }
  1108. .proName{
  1109. margin: 23rpx 0 0 20rpx;
  1110. }
  1111. .proINname{
  1112. margin: 25rpx 0 0 21rpx;
  1113. width: 709rpx;
  1114. height: 90rpx;
  1115. border-radius: 13rpx;
  1116. background: rgba(245, 248, 252, 1);
  1117. border: 1rpx solid rgba(229, 229, 229, 1);
  1118. font-size: 28rpx;
  1119. line-height: 90rpx;
  1120. /* 自动换行 */
  1121. word-wrap: break-word;
  1122. word-break: break-all;
  1123. white-space: pre-line;
  1124. /* color: rgba(179, 179, 179, 1); */
  1125. }
  1126. .proIMi{
  1127. height: 315rpx;
  1128. }
  1129. .proMiao{
  1130. margin: 31rpx 0 0 20rpx;
  1131. }
  1132. /* 上传附件 */
  1133. .upload-img{
  1134. /* width: 200rpx;
  1135. height: 80rpx;
  1136. opacity: 1;
  1137. border-radius: 13rpx;
  1138. background: rgba(0, 97, 255, 0.1);
  1139. border: 1rpx solid rgba(0, 97, 255, 1); */
  1140. }
  1141. .jindu{
  1142. font-size: 32rpx;
  1143. font-weight: 500;
  1144. line-height: 46rpx;
  1145. }
  1146. /* 进度 */
  1147. .jindu-kuang{
  1148. font-size: 24rpx;
  1149. line-height: 35rpx;
  1150. color: rgba(128, 128, 128, 1);
  1151. }
  1152. .jindu-circle{
  1153. margin-top: 10rpx;
  1154. width: 100rpx;
  1155. height: 100rpx;
  1156. border-radius: 50%;
  1157. opacity: 1;
  1158. background-color:rgba(204, 204, 204, 1);
  1159. }
  1160. .jindu-type{
  1161. /* width: 103rpx; */
  1162. height: 40rpx;
  1163. border-radius: 71rpx;
  1164. font-size: 24rpx;
  1165. line-height: 40rpx;
  1166. color: rgba(255, 255, 255, 1);
  1167. text-align: center;
  1168. margin: 0 0 0 20rpx;
  1169. }
  1170. .lixiang{
  1171. background: linear-gradient(90deg, rgba(54, 111, 255, 1) 0%, rgba(93, 160, 252, 1) 100%);
  1172. }
  1173. .cuiban{
  1174. background: linear-gradient(90deg, rgba(57, 167, 139, 1) 0%, rgba(126, 224, 203, 1) 100%);
  1175. }
  1176. .tijiao{
  1177. background: linear-gradient(90deg, rgba(255, 112, 69, 1) 0%, rgba(247, 161, 114, 1) 100%);
  1178. }
  1179. .jindu-line{
  1180. width: 4rpx;
  1181. height: 100rpx;
  1182. background-color: rgba(166, 166, 166, 1);
  1183. }
  1184. .weidu{
  1185. margin: 7rpx 0 0 20rpx;
  1186. font-size: 24rpx;
  1187. line-height: 35rpx;
  1188. color: rgba(128, 128, 128, 1);
  1189. }
  1190. .addRen{
  1191. margin: -80rpx 0 0 581rpx;
  1192. width: 149rpx;
  1193. height: 59rpx;
  1194. border-radius: 92rpx;
  1195. background: rgba(0, 97, 255, 1);
  1196. font-size: 28rpx;
  1197. line-height: 59rpx;
  1198. color: rgba(255, 255, 255, 1);
  1199. text-align: center;
  1200. }
  1201. /* 任务列表 */
  1202. .renwu{
  1203. display: flex;
  1204. margin-top: 6rpx;
  1205. width: 709rpx;
  1206. height: 90rpx;
  1207. border-radius: 13rpx;
  1208. background: rgba(245, 248, 252, 1);
  1209. border: 1rpx solid rgba(229, 229, 229, 1);
  1210. font-size: 28rpx;
  1211. justify-content: space-evenly;
  1212. align-items: center;
  1213. }
  1214. .renwu-bu{
  1215. width: 105rpx;
  1216. height: 50rpx;
  1217. border-radius: 110rpx;
  1218. line-height:50rpx;
  1219. text-align: center;
  1220. }
  1221. .bianji{
  1222. border: 1rpx solid rgba(0, 97, 255, 1);
  1223. color: rgba(0, 97, 255, 1);
  1224. }
  1225. .delete{
  1226. margin-left: 20rpx;
  1227. border: 1rpx solid rgba(212, 48, 48, 1);
  1228. color: rgba(212, 48, 48, 1);
  1229. }
  1230. .project{
  1231. display: flex;
  1232. margin: 61rpx 0 0 0;
  1233. justify-content: space-evenly;
  1234. }
  1235. .butt{
  1236. width: 330rpx;
  1237. height: 90rpx;
  1238. border-radius: 117rpx;
  1239. font-size: 32rpx;
  1240. line-height: 90rpx;
  1241. text-align: center;
  1242. }
  1243. .quxiao{
  1244. border: 1rpx solid rgba(0, 97, 255, 1);
  1245. color: rgba(0, 97, 255, 1);
  1246. }
  1247. .queren{
  1248. background: rgba(0, 97, 255, 1);
  1249. color: rgba(255, 255, 255, 1);
  1250. }
  1251. </style>