lsw 10 달 전
부모
커밋
56a4f5b7ce
34개의 변경된 파일451개의 추가작업 그리고 1045개의 파일을 삭제
  1. 3 0
      admin-ui/src/assets/styles/extend.scss
  2. 1 1
      admin-ui/src/views/work/money/recharge/edit.vue
  3. 2 2
      admin-ui/src/views/work/pay/cash_out.vue
  4. 39 3
      admin-ui/src/views/work/pay/detail.vue
  5. 15 3
      admin-ui/src/views/work/pay/index.vue
  6. 0 11
      app/common/animate.min.css
  7. 37 1
      app/common/common.scss
  8. 32 27
      app/components/images/images.vue
  9. 1 1
      app/pages.json
  10. 3 3
      app/pages/news/detail.vue
  11. 47 37
      app/pages/serve/index.vue
  12. 1 1
      app/pages/user/index.vue
  13. 114 38
      app/pages/user/money/add.vue
  14. 8 29
      app/pages/user/money/cash_out.vue
  15. 27 5
      app/pages/user/money/index.vue
  16. 1 1
      app/pages/user/resume/application/task_detail.vue
  17. 2 1
      app/pages/user/resume/application/task_list.vue
  18. 0 52
      app/uni_modules/uview-ui/components/u-avatar-group/props.js
  19. 0 103
      app/uni_modules/uview-ui/components/u-avatar-group/u-avatar-group.vue
  20. 0 78
      app/uni_modules/uview-ui/components/u-avatar/props.js
  21. 0 58
      app/uni_modules/uview-ui/components/u-avatar/u-avatar.vue
  22. 0 14
      app/uni_modules/uview-ui/components/u-grid-item/props.js
  23. 0 209
      app/uni_modules/uview-ui/components/u-grid-item/u-grid-item.vue
  24. 0 19
      app/uni_modules/uview-ui/components/u-grid/props.js
  25. 0 97
      app/uni_modules/uview-ui/components/u-grid/u-grid.vue
  26. 0 84
      app/uni_modules/uview-ui/components/u-keyboard/props.js
  27. 0 164
      app/uni_modules/uview-ui/components/u-keyboard/u-keyboard.vue
  28. 6 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/api/Api_PayController.java
  29. 7 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/controller/PayController.java
  30. 6 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/Pay.java
  31. 23 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/dto/PayAddDto.java
  32. 21 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/service/IPayService.java
  33. 52 3
      ruoyi-admin/src/main/java/com/ruoyi/web/work/service/impl/PayServiceImpl.java
  34. 3 0
      ruoyi-admin/src/main/java/com/ruoyi/web/work/service/impl/TaskListServiceImpl.java

+ 3 - 0
admin-ui/src/assets/styles/extend.scss

@@ -513,3 +513,6 @@
   color: #1890ff;
   font-size: 14px;
 }
+.el-upload-list--picture-card .el-upload-list__item-thumbnail{
+  width: 100%;
+}

+ 1 - 1
admin-ui/src/views/work/money/recharge/edit.vue

@@ -27,7 +27,7 @@
         <el-form-item label="开户行">
           <el-input v-model="platform.bankName" />
         </el-form-item>
-        <el-form-item label="充值到账">
+        <el-form-item label="卡号">
           <el-input v-model="platform.bankAccount" />
         </el-form-item>
       </el-form>

+ 2 - 2
admin-ui/src/views/work/pay/cash_out.vue

@@ -32,8 +32,8 @@
       </el-table-column>
       <el-table-column label="提现方式" align="center" width="130">
         <template slot-scope="scope">
-          <span class="icon" v-if="scope.row.way == 0">&#xe66b; 提现到银行卡</span>
-          <span class="icon" v-else>&#xe620; 提现到微信</span>
+          <span class="icon" v-if="scope.row.way == 0" style="color: #FF5722;">&#xe66b; 提现到银行卡</span>
+          <span class="icon" v-else style="color: #4CAF50;">&#xe620; 提现到微信</span>
         </template>
       </el-table-column>
       <el-table-column label="提现金额" align="center" prop="money" width="110" />

+ 39 - 3
admin-ui/src/views/work/pay/detail.vue

@@ -6,7 +6,7 @@
           <span class="pon" @click="info()">{{ user.name }}</span>
         </el-form-item>
         <el-form-item label="充值方式">
-          <el-input value="微信充值" />
+          <el-input :value="form.payWay == 0 ? '微信充值' : '转账充值'" />
         </el-form-item>
       </el-form>
       <el-form ref="form" disabled :model="form" :rules="rules" label-width="120px">
@@ -15,10 +15,23 @@
             <template slot="append">元</template>
           </el-input>
         </el-form-item>
-        <el-form-item label="充值状态">
-          <el-input :value="form.state == 0 ? '未支付' : '充值成功'" />
+        <el-form-item label="充值凭证" prop="certificate" v-if="form.payWay == 1">
+          <ImageUpload v-model="form.certificate" :isShowTip="false" :limit="1" read></ImageUpload>
         </el-form-item>
+        <div class="opp" v-if="form.updateTime && form.payWay == 1">
+          <span>操作人:{{ form.updateBy }},</span>
+          <span>操作时间:{{ form.updateTime }}</span>
+        </div>
       </el-form>
+      <el-alert title="充值成功" type="success" show-icon class="cg" v-if="form.state === 1"></el-alert>
+      <el-alert title="用户未支付" type="error" show-icon class="cg" v-if="form.state === 0 && form.payWay == 0"></el-alert>
+      <el-alert title="待审核" type="error" show-icon class="cg" v-if="form.state === 0 && form.payWay == 1"></el-alert>
+      <el-alert title="充值失败" :description="form.msg" type="error" show-icon class="cg" v-if="form.state === 2" :closable="false"></el-alert>
+    </div>
+    <div class="mfooter" v-if="form.payWay == 1 && !param.detail">
+      <el-button type="primary" @click="submitForm(1)">确 认</el-button>
+      <el-button type="danger" @click="submitForm(2)">不通过</el-button>
+      <el-button @click="$layer.close(layerid)">取 消</el-button>
     </div>
   </div>
 </template>
@@ -55,6 +68,29 @@ export default {
   methods: {
     info() {
       this.iframe({ obj: info, param: { id: this.user.id, detail: true }, title: '用户详情', width: '55%', height: '65%' });
+    },
+    submitForm(state) {
+      this.$refs['form'].validate((valid) => {
+        if (valid) {
+          this.$prompt(state == 1 ? '确认用户充值? 该操作不可撤销!' : '确认驳回充值', {
+            type: 'warning',
+            showInput: state == 1 ? false : true,
+            inputType: 'textarea',
+            inputPlaceholder: '充值不通过原因',
+            inputValidator: (value) => {
+              if (!value && state == 2) {
+                return '请输入驳回原因';
+              }
+            }
+          }).then(({ value }) => {
+            this.post({ url: '/work/pay/confirm', data: { id: this.form.id, state: state, msg: value } }).then((response) => {
+              this.$modal.msgSuccess('操作成功');
+              this.$layer.close(this.layerid);
+              this.$parent.getList();
+            });
+          });
+        }
+      });
     }
   }
 };

+ 15 - 3
admin-ui/src/views/work/pay/index.vue

@@ -32,19 +32,28 @@
       <el-table-column label="充值金额" align="center" prop="money" width="130" />
       <el-table-column label="充值方式" align="center" width="130">
         <template slot-scope="scope">
-          <span class="icon">&#xe620; 微信充值</span>
+          <span class="icon" v-if="scope.row.payWay == 0" style="color: #4caf50">&#xe620; 微信充值</span>
+          <span class="icon" v-else style="color: #ff5722">&#xe66b; 转账充值</span>
         </template>
       </el-table-column>
       <el-table-column label="充值状态" align="center" prop="state" width="130">
         <template slot-scope="scope">
-          <el-tag type="danger" v-if="scope.row.state == 0">未支付</el-tag>
+          <el-tag type="danger" v-if="scope.row.state == 0 && scope.row.payWay == 0">未支付</el-tag>
+          <el-tag type="danger" v-if="scope.row.state == 0 && scope.row.payWay == 1">待确认</el-tag>
           <el-tag type="success" v-if="scope.row.state == 1">充值成功</el-tag>
+          <el-popover placement="top-start" v-if="scope.row.state == 2 && scope.row.payWay == 1" title="原因" width="200" trigger="hover" :content="scope.row.msg">
+            <div slot="reference">
+              <el-tag type="danger">驳回</el-tag>
+              <i class="el-icon-warning"></i>
+            </div>
+          </el-popover>
         </template>
       </el-table-column>
       <el-table-column label="充值时间" align="center" prop="createTime" width="160" />
       <el-table-column label="操作" align="center" width="160">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-view" @click="op('detail', scope.row)" v-hasPermi="['work:pay:list']">详情</el-button>
+          <el-button size="mini" type="text" icon="el-icon-edit" @click="op('audit', scope.row)" v-hasPermi="['work:pay:audit']" v-if="scope.row.state == 0 && scope.row.payWay == 1">确认</el-button>
         </template>
       </el-table-column>
       <template slot="empty">
@@ -104,7 +113,10 @@ export default {
         this.iframe({ obj: info, param: { id: row.userId, detail: true }, title: '用户详情', width: '55%', height: '65%' });
       }
       if (tag == 'detail') {
-        this.iframe({ obj: detail, param: { id: row.id, detail: true }, title: '充值详情', width: '35%', height: '45%' });
+        this.iframe({ obj: detail, param: { id: row.id, detail: true }, title: '充值详情', width: '35%', height: '60%' });
+      }
+      if (tag == 'audit') {
+        this.iframe({ obj: detail, param: { id: row.id }, title: '充值确认', width: '35%', height: '60%' });
       }
     }
   }

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 11
app/common/animate.min.css


+ 37 - 1
app/common/common.scss

@@ -246,7 +246,7 @@
 		overflow: hidden;
 		border-bottom: 1px solid $line;
 		padding: 10px;
-		&:first-child{
+		&:first-child {
 			margin-top: 10px;
 		}
 		&:last-child {
@@ -259,6 +259,11 @@
 			float: right;
 			width: 70%;
 			text-align: right;
+			image {
+				width: 50px;
+				height: 50px;
+				border-radius: 5px;
+			}
 		}
 	}
 }
@@ -669,6 +674,9 @@
 .pt0 {
 	padding-top: 0px;
 }
+.pt5 {
+	padding-top: 5px !important;
+}
 .org {
 	color: orangered;
 }
@@ -796,6 +804,9 @@
 .pd0 {
 	padding-bottom: 0px;
 }
+.pd5 {
+	padding-bottom: 5px !important;
+}
 .pl0 {
 	padding-left: 0px;
 }
@@ -812,3 +823,28 @@
 		color: blue;
 	}
 }
+.lit {
+	padding: 15px 0px 15px 0px;
+	border-bottom: 1px solid $line;
+	.tb {
+		padding-right: 6px;
+		font-size: 25px;
+		float: left;
+		margin-top: -3px;
+	}
+	.desc {
+		font-size: 13px;
+		padding-left: 5px;
+		color: #a8a8a8;
+	}
+	.check {
+		float: right;
+		color: $main-color;
+		margin-top: -22px;
+		font-size: 20px;
+	}
+	&:last-child {
+		border: 0px;
+		padding-bottom: 5px;
+	}
+}

+ 32 - 27
app/components/images/images.vue

@@ -24,6 +24,10 @@ export default {
 		read: {
 			type: Boolean,
 			default: false
+		},
+		limit: {
+			type: Number,
+			default: 3
 		}
 	},
 	data() {
@@ -42,37 +46,38 @@ export default {
 	},
 	methods: {
 		chooseImage() {
-			//照片选择
-			uni.chooseImage({
-				count: 3, //默认9
-				sizeType: ['compressed'], //可以指定是原图还是压缩图,默认二者都有
-				success: (res) => {
-					res.tempFilePaths.forEach((path) => {
-						uni.showLoading({ title: '正在上传图片', mask: true });
-						uni.uploadFile({
-							url: this.ip + '/app/common/upload',
-							filePath: path,
-							name: 'file',
-							header: { Authorization: this.getUser().token },
-							success: (res) => {
-								let data = JSON.parse(res.data);
-								if (data.code == 200) {
-									console.log('asd:' + data.fileName);
-									if (this.list.length < 3) {
+			if (this.list.length < this.limit) {
+				//照片选择
+				uni.chooseImage({
+					count: this.limit, //默认9
+					sizeType: ['compressed'], //可以指定是原图还是压缩图,默认二者都有
+					success: (res) => {
+						res.tempFilePaths.forEach((path) => {
+							uni.showLoading({ title: '正在上传图片', mask: true });
+							uni.uploadFile({
+								url: this.ip + '/app/common/upload',
+								filePath: path,
+								name: 'file',
+								header: { Authorization: this.getUser().token },
+								success: (res) => {
+									let data = JSON.parse(res.data);
+									if (data.code == 200) {
 										this.list.push(data.fileName);
+										this.$emit('input', this.list);
 									}
-									this.$emit('input', this.list);
+									uni.hideLoading();
+								},
+								fail: (res) => {
+									uni.hideLoading();
+									uni.showModal({ content: '图片上传失败', showCancel: false });
 								}
-								uni.hideLoading();
-							},
-							fail: (res) => {
-								uni.hideLoading();
-								uni.showModal({ content: '图片上传失败', showCancel: false });
-							}
+							});
 						});
-					});
-				}
-			});
+					}
+				});
+			} else {
+				uni.showModal({ content: '只能上传' + this.limit + '张图片', showCancel: false });
+			}
 		},
 		preview(item) {
 			let urls = [];

+ 1 - 1
app/pages.json

@@ -93,7 +93,7 @@
 		{
 			"path": "pages/other/webview",
 			"style": {
-				"navigationBarTitleText": "政策资讯"
+				"navigationBarTitleText": ""
 			}
 		},
 		{

+ 3 - 3
app/pages/news/detail.vue

@@ -1,9 +1,9 @@
 <template>
 	<view class="main">
 		<view class="content">
-			<view class="title">{{ item.title }}</view>
+			<view class="title">{{ item.title || '' }}</view>
 			<view class="desc">
-				<text class="time">发布于:{{ item.createTime }}</text>
+				<text class="time">发布于:{{ item.createTime || '' }}</text>
 				<button class="fx" open-type="share">
 					<text class="icon">&#xe637;</text>
 					<text>分享</text>
@@ -11,7 +11,7 @@
 			</view>
 			<view class="con">
 				<u-divider :dot="true"></u-divider>
-				<u-parse :content="item.contents"></u-parse>
+				<u-parse :content="item.contents || ''"></u-parse>
 			</view>
 		</view>
 	</view>

+ 47 - 37
app/pages/serve/index.vue

@@ -83,47 +83,49 @@
 				</view>
 			</view>
 		</view>
-		<!--新闻-->
-		<view class="news">
-			<view class="gg">
-				<view class="title">最新资讯</view>
-				<view class="bor"></view>
-				<view class="more" @click="go('/pages/news/index?type=新闻资讯')">
-					<text>更多</text>
-					<text class="icon">&#xe62b;</text>
-				</view>
-			</view>
-			<view class="bhe" :style="{ height: expand ? 'auto' : '60px' }">
-				<view class="item" v-for="(item, index) in newsList" :key="index" @click="go('/pages/news/detail?id=' + item.id)">
-					<view class="title omit">{{ item.title }}</view>
-					<view class="date">{{ item.createTime.substring(5, 10) }}</view>
+		<view v-if="platform.openNews == 0">
+			<!--新闻-->
+			<view class="news">
+				<view class="gg">
+					<view class="title">最新资讯</view>
+					<view class="bor"></view>
+					<view class="more" @click="go('/pages/news/index?type=新闻资讯')">
+						<text>更多</text>
+						<text class="icon">&#xe62b;</text>
+					</view>
 				</view>
-			</view>
-			<view class="expand" @click="expand = !expand">
-				<text class="icon" v-if="expand">&#xe61c;</text>
-				<text class="icon" v-else>&#xe617;</text>
-				<text>{{ expand ? '收起' : '展开' }}</text>
-			</view>
-		</view>
-		<!--横幅-->
-		<image :src="img.a1" class="hengfu" @click="go('/pages/news/index?type=政策专题')"></image>
-		<!--图片内容-->
-		<view class="ad" style="margin-left: -10px; margin-right: -10px">
-			<view class="item" style="height: 190px">
-				<view class="out" style="padding-right: 0px" @click="go('/pages/news/index?type=就业政策')">
-					<view class="int" style="height: 175px; box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.2)">
-						<image :src="img.a2" style="height: 180px; width: 100%"></image>
+				<view class="bhe" :style="{ height: expand ? 'auto' : '60px' }">
+					<view class="item" v-for="(item, index) in newsList" :key="index" @click="go('/pages/news/detail?id=' + item.id)">
+						<view class="title omit">{{ item.title }}</view>
+						<view class="date">{{ item.createTime.substring(5, 10) }}</view>
 					</view>
 				</view>
+				<view class="expand" @click="expand = !expand">
+					<text class="icon" v-if="expand">&#xe61c;</text>
+					<text class="icon" v-else>&#xe617;</text>
+					<text>{{ expand ? '收起' : '展开' }}</text>
+				</view>
 			</view>
-			<view class="item" style="height: 190px">
-				<view class="out">
-					<view class="int">
-						<view class="it" style="height: 80px" @click="go('/pages/news/index?type=人才政策')">
-							<image :src="img.a3" mode="aspectFill" style="height: 85px; width: 100%"></image>
+			<!--横幅-->
+			<image :src="img.a1" class="hengfu" @click="go('/pages/news/index?type=政策专题')"></image>
+			<!--图片内容-->
+			<view class="ad" style="margin-left: -10px; margin-right: -10px">
+				<view class="item" style="height: 190px">
+					<view class="out" style="padding-right: 0px" @click="go('/pages/news/index?type=就业政策')">
+						<view class="int" style="height: 175px; box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.2)">
+							<image :src="img.a2" style="height: 180px; width: 100%"></image>
 						</view>
-						<view class="it" style="height: 86px; margin-top: 10px" @click="go('/pages/news/index?type=创业政策')">
-							<image :src="img.a4" mode="aspectFill" style="height: 83px; width: 100%"></image>
+					</view>
+				</view>
+				<view class="item" style="height: 190px">
+					<view class="out">
+						<view class="int">
+							<view class="it" style="height: 80px" @click="go('/pages/news/index?type=人才政策')">
+								<image :src="img.a3" mode="aspectFill" style="height: 85px; width: 100%"></image>
+							</view>
+							<view class="it" style="height: 86px; margin-top: 10px" @click="go('/pages/news/index?type=创业政策')">
+								<image :src="img.a4" mode="aspectFill" style="height: 83px; width: 100%"></image>
+							</view>
 						</view>
 					</view>
 				</view>
@@ -148,7 +150,8 @@ export default {
 			noticeList: [],
 			newsList: [],
 			expand: false,
-			show: false
+			show: false,
+			platform: { openNews: 1 }
 		};
 	},
 	onLoad() {
@@ -179,6 +182,13 @@ export default {
 					this.newsList = res.data.data;
 				}
 			});
+			//平台信息
+			this.http.request({
+				url: '/app/pay/getPlatform',
+				success: (res) => {
+					this.platform = res.data.data;
+				}
+			});
 		},
 		url(title) {
 			this.title = title;

+ 1 - 1
app/pages/user/index.vue

@@ -274,7 +274,7 @@ export default {
 	},
 	onShow() {
 /* 		this.user = {
-			token: 'eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6IjdhZGY4MzFmLWE0NjQtNGY5YS04YTY5LWMzM2QyNDU2MzI2ZSJ9.EPHElRmlVoFTfT4OxHNpvIC7bDKc1gKpNiO1u_dBOerYh5JFIuSrSkgp0PtQ0kOhO9iuvU0dttEGbsgofdrcpQ'
+			token: 'eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6IjY2MTJkMGI2LWVlZDYtNGI4NS04NjliLTUxOGNmZjQ1NDBlZSJ9.V4li-W5z_C6qS6KylYd8mdeetClOkacVpAqLQ6gNlENc47AJlpGrsIi0PjpJ6p7S-lorDZ7M4bDvOgRQSe8CyA'
 		};
 		uni.setStorageSync('user', this.user); */
 

+ 114 - 38
app/pages/user/money/add.vue

@@ -1,8 +1,51 @@
 <template>
 	<view class="main">
-		<view class="form_group">
-			<view class="lable re">充值金额</view>
-			<input type="digit" v-model="item.money" placeholder="请输入充值金额" />
+		<view class="mcard pd5 pt5">
+			<view class="form_group">
+				<view class="lable">充值金额</view>
+				<input type="digit" v-model="item.money" placeholder="请输入充值金额" />
+			</view>
+		</view>
+		<view class="mcard mt10 pd0 pt5">
+			<view class="form_group">
+				<view class="lable">充值方式</view>
+				<view class="item">
+					<view class="lit" @click="item.way = 0">
+						<text class="icon tb" style="color: #4caf50">&#xe620;</text>
+						<view class="title">微信充值</view>
+						<text class="icon check" v-if="item.way == 0">&#xe612;</text>
+					</view>
+					<view class="lit" @click="item.way = 1">
+						<text class="icon tb" style="color: #ff9800">&#xe635;</text>
+						<view class="title">转账充值</view>
+						<text class="icon check" v-if="item.way == 1">&#xe612;</text>
+					</view>
+				</view>
+			</view>
+		</view>
+		<view v-if="item.way == 1">
+			<view class="mcard mt10 pt5">
+				<view class="form_group"><view class="lable">转账信息</view></view>
+				<view class="lit">
+					<view class="title">{{ platform.serviceCompany }}</view>
+				</view>
+				<view class="lit">
+					<view class="title">{{ platform.bankName }}</view>
+				</view>
+				<view class="lit">
+					<view class="title">{{ platform.bankAccount }}</view>
+				</view>
+			</view>
+			<view class="mcard mt10 pt5">
+				<view class="form_group">
+					<view class="lable">充值凭证</view>
+					<images v-model="item.pic" :limit="1"></images>
+				</view>
+				<view class="bz">
+					<text class="icon">&#xe694;</text>
+					<text>例如:付款或者转账截图</text>
+				</view>
+			</view>
 		</view>
 		<button class="btn" @click="pay()">确认</button>
 	</view>
@@ -12,48 +55,81 @@
 export default {
 	data() {
 		return {
-			item: {}
+			item: { way: 0, pic: [] },
+			platform: {}
 		};
 	},
+	onLoad() {
+		this.getPlatform();
+	},
 	methods: {
-		pay() {
+		//平台服务费信息
+		getPlatform() {
 			this.http.request({
-				url: '/app/wxPay/pay',
-				method: 'POST',
-				data: this.item,
+				url: '/app/pay/getPlatform',
 				success: (res) => {
-					wx.requestPayment({
-						appId: res.data.data.appId,
-						nonceStr: res.data.data.nonceStr,
-						package: res.data.data.package,
-						paySign: res.data.data.paySign,
-						timeStamp: res.data.data.timeStamp,
-						signType: res.data.data.signType,
-						success: (r) => {
-							uni.showModal({
-								title: '提示',
-								content: '充值成功:' + this.item.money + ' 元',
-								showCancel: false,
-								success: (res) => {
-									uni.$emit('payMoney');
-									uni.navigateBack();
-								}
-							});
-						},
-						fail: (r) => {
-							uni.showModal({
-								title: '提示',
-								content: r.errMsg.includes('cancel') ? '支付取消' : '支付异常',
-								showCancel: false,
-								success: (res) => {
-									uni.$emit('payMoney');
-									uni.navigateBack();
-								}
-							});
-						}
-					});
+					this.platform = res.data.data;
 				}
 			});
+		},
+		pay() {
+			if (this.item.way == 0) {
+				this.http.request({
+					url: '/app/wxPay/pay',
+					method: 'POST',
+					data: this.item,
+					success: (res) => {
+						wx.requestPayment({
+							appId: res.data.data.appId,
+							nonceStr: res.data.data.nonceStr,
+							package: res.data.data.package,
+							paySign: res.data.data.paySign,
+							timeStamp: res.data.data.timeStamp,
+							signType: res.data.data.signType,
+							success: (r) => {
+								uni.showModal({
+									title: '提示',
+									content: '充值成功:' + this.item.money + ' 元',
+									showCancel: false,
+									success: (res) => {
+										uni.$emit('payMoney');
+										uni.navigateBack();
+									}
+								});
+							},
+							fail: (r) => {
+								uni.showModal({
+									title: '提示',
+									content: r.errMsg.includes('cancel') ? '支付取消' : '支付异常',
+									showCancel: false,
+									success: (res) => {
+										uni.$emit('payMoney');
+										uni.navigateBack();
+									}
+								});
+							}
+						});
+					}
+				});
+			} else {
+				this.item.certificate = this.item.pic[0];
+				this.http.request({
+					url: '/app/pay/add',
+					method: 'POST',
+					data: this.item,
+					success: (res) => {
+						uni.showModal({
+							title: '提示',
+							content: '提交成功,待后台审核确认',
+							showCancel: false,
+							success: (res) => {
+								uni.$emit('payMoney');
+								uni.navigateBack();
+							}
+						});
+					}
+				});
+			}
 		}
 	}
 };

+ 8 - 29
app/pages/user/money/cash_out.vue

@@ -4,16 +4,16 @@
 			<view class="money">{{ money }}</view>
 			<view class="desc">可提现余额(元)</view>
 		</view>
-		<view class="mcard mt10 pd0">
+		<view class="mcard mt10 pd0 pt5">
 			<view class="form_group">
-				<view class="lable re">提现金额</view>
+				<view class="lable">提现金额</view>
 				<view class="bgm">
 					<input type="digit" v-model="item.money" placeholder="请输入提现金额" class="input" />
 					<view class="msg" @click="all()">提现全部</view>
 				</view>
 			</view>
 			<view class="form_group">
-				<view class="lable re">提现方式</view>
+				<view class="lable">提现方式</view>
 				<view class="item">
 					<view class="lit" @click="item.way = 0">
 						<text class="icon tb" style="color: #ff9800">&#xe635;</text>
@@ -31,7 +31,11 @@
 				</view>
 			</view>
 		</view>
-		<view class="bz" v-if="platform.cashOutMoney > 0">最少提现金额:¥{{ platform.cashOutMoney }}起</view>
+		<view class="bz">
+			<text class="icon">&#xe694;</text>
+			<text v-if="platform.cashOutMoney > 0">单次最少提现金额:¥{{ platform.cashOutMoney }}起</text>
+			<text v-if="platform.cashOutMaxMoney">,单次最大提现金额:¥{{ platform.cashOutMaxMoney }}</text>
+		</view>
 		<button class="btn" @click="save()">确认</button>
 		<u-popup :show="show" round="15" mode="center" :closeable="true" :closeOnClickOverlay="false" :customStyle="{ width: '85%' }" @close="show = false">
 			<view class="popup">
@@ -146,29 +150,4 @@ export default {
 		width: 50%;
 	}
 }
-.lit {
-	padding: 15px 0px 15px 0px;
-	border-bottom: 1px solid $line;
-	.tb {
-		padding-right: 6px;
-		font-size: 25px;
-		float: left;
-		margin-top: -3px;
-	}
-	.desc {
-		font-size: 13px;
-		padding-left: 5px;
-		color: #a8a8a8;
-	}
-	.check {
-		float: right;
-		color: $main-color;
-		margin-top: -22px;
-		font-size: 20px;
-	}
-	&:last-child {
-		border: 0px;
-		padding-bottom: 5px;
-	}
-}
 </style>

+ 27 - 5
app/pages/user/money/index.vue

@@ -29,7 +29,8 @@
 			<view class="item" v-for="(item, index) in list" :key="index" @click="popup(item)">
 				<view class="title">{{ item.title }}</view>
 				<view class="desc">
-					<text v-if="item.state == 0 && item.type == 0" style="color: #f44336">未支付</text>
+					<text v-if="item.state == 0 && item.type == 0 && item.payWay == 0" style="color: #f44336">未支付</text>
+					<text v-if="item.state == 0 && item.type == 0 && item.payWay == 1" style="color: #f44336">待审核</text>
 					<text v-if="item.state == 1 && item.type == 0" style="color: #4caf50">充值成功</text>
 					<text v-if="item.state == 1 && item.type == 1" style="color: #4caf50">兼职支出</text>
 					<text v-if="item.state == 0 && item.type == 2" style="color: #f44336">提现审核中...</text>
@@ -39,6 +40,10 @@
 						<text class="icon" style="padding-right: 5px">&#xe610;</text>
 						<text>提现失败,退回余额</text>
 					</text>
+					<text v-if="item.state == 2 && item.payWay == 1" style="color: #f44336">
+						<text class="icon" style="padding-right: 5px">&#xe610;</text>
+						<text>审核失败</text>
+					</text>
 					<text v-if="item.state == 1 && item.type == 4" style="color: #4caf50">退款成功</text>
 					<text>{{ item.createTime }}</text>
 				</view>
@@ -53,9 +58,10 @@
 			<view class="loading" v-if="loadMore"><u-loadmore :status="loadMore ? 'loading' : 'nomore'" /></view>
 			<u-empty v-if="!loadMore && list.length == 0"></u-empty>
 		</view>
-		<u-popup :show="show" round="15" mode="center" :closeable="true" :customStyle="{ width: '85%' }" @close="show = false">
+		<u-popup :show="show" round="15" mode="center" :closeable="true" :customStyle="{ width: '95%' }" @close="show = false">
 			<view class="popup">
-				<view class="mtt" v-if="item.type == 0">在线充值</view>
+				<view class="mtt" v-if="item.type == 0 && item.payWay == 0">微信充值</view>
+				<view class="mtt" v-if="item.type == 0 && item.payWay == 1">转账充值</view>
 				<view class="mtt" v-if="item.type == 1">兼职支出</view>
 				<view class="mtt" v-if="item.type == 2">余额提现</view>
 				<view class="mtt" v-if="item.type == 3">兼职收入</view>
@@ -103,7 +109,9 @@
 					</view>
 					<view class="item">
 						<text class="tt">操作状态</text>
-						<text class="la" v-if="item.state == 0 && item.type == 0" style="color: #f44336">未支付</text>
+						<text class="la" v-if="item.state == 0 && item.type == 0 && item.payWay == 0" style="color: #f44336">未支付</text>
+						<text class="la" v-if="item.state == 0 && item.type == 0 && item.payWay == 1" style="color: #f44336">待审核</text>
+						<text class="la" v-if="item.state == 2 && item.type == 0 && item.payWay == 1" style="color: #f44336">审核不通过</text>
 						<text class="la" v-if="item.state == 1 && item.type == 0" style="color: #4caf50">充值成功</text>
 						<text class="la" v-if="item.state == 1 && item.type == 1" style="color: #4caf50">支出成功</text>
 						<text class="la" v-if="item.state == 0 && item.type == 2" style="color: #f44336">提现审核中...</text>
@@ -112,7 +120,13 @@
 						<text class="la" v-if="item.state == 2 && item.type == 2" style="color: #f44336">提现失败,退回余额</text>
 						<text class="la" v-if="item.state == 1 && item.type == 4" style="color: #4caf50">退款成功</text>
 					</view>
-					<view class="item" v-if="item.msg">
+					<view class="item" v-if="item.type == 0 && item.payWay == 1">
+						<text class="tt">转账凭证</text>
+						<view class="la">
+							<image :src="ip + item.certificate" mode="aspectFill" @click="preview(item.certificate)"></image>
+						</view>
+					</view>
+					<view class="item" v-if="item.state == 2 && item.msg">
 						<text class="tt">失败原因</text>
 						<text class="la" style="color: #f44336">{{ item.msg }}</text>
 					</view>
@@ -134,6 +148,7 @@
 export default {
 	data() {
 		return {
+			ip: this.http.ip,
 			money: 0,
 			current: 0,
 			type: [
@@ -191,6 +206,13 @@ export default {
 		go(url) {
 			uni.navigateTo({ url: url });
 		},
+		preview(certificate) {
+			uni.previewImage({
+				urls: [this.ip + certificate],
+				current: this.ip + certificate,
+				success: (res) => {}
+			});
+		},
 		//刷新数据
 		refresh() {
 			this.loadMore = true;

+ 1 - 1
app/pages/user/resume/application/task_detail.vue

@@ -20,7 +20,7 @@
 		<view class="mfooter">
 			<view class="cn">
 				<view class="f">
-					<button class="btn" style="background-color: #607d8b" @click="go('/pages/user/resume/application/task_list?taskId=' + obj.id + '&role=' + obj.role)">
+					<button class="btn" style="background-color: #607d8b" @click="go('/pages/user/resume/application/task_list?taskId=' + obj.id + '&role=' + obj.role + '&isComplete=' + obj.isComplete)">
 						<text class="icon">&#xe656;</text>
 						<text>任务日志</text>
 					</button>

+ 2 - 1
app/pages/user/resume/application/task_list.vue

@@ -14,7 +14,7 @@
 			</view>
 			<u-empty v-if="list.length == 0"></u-empty>
 		</view>
-		<view class="mfooter" v-if="param.role == 1">
+		<view class="mfooter" v-if="param.role == 1 && param.isComplete != 2">
 			<button class="btn" @click="show()">
 				<text class="icon">&#xe7c4;</text>
 				<text>添加</text>
@@ -35,6 +35,7 @@ export default {
 	onLoad(e) {
 		this.param.taskId = e.taskId;
 		this.param.role = e.role || 0;
+		this.param.isComplete = e.isComplete;
 		this.getData();
 	},
 	methods: {

+ 0 - 52
app/uni_modules/uview-ui/components/u-avatar-group/props.js

@@ -1,52 +0,0 @@
-export default {
-    props: {
-        // 头像图片组
-        urls: {
-            type: Array,
-            default: uni.$u.props.avatarGroup.urls
-        },
-        // 最多展示的头像数量
-        maxCount: {
-            type: [String, Number],
-            default: uni.$u.props.avatarGroup.maxCount
-        },
-        // 头像形状
-        shape: {
-            type: String,
-            default: uni.$u.props.avatarGroup.shape
-        },
-        // 图片裁剪模式
-        mode: {
-            type: String,
-            default: uni.$u.props.avatarGroup.mode
-        },
-        // 超出maxCount时是否显示查看更多的提示
-        showMore: {
-            type: Boolean,
-            default: uni.$u.props.avatarGroup.showMore
-        },
-        // 头像大小
-        size: {
-            type: [String, Number],
-            default: uni.$u.props.avatarGroup.size
-        },
-        // 指定从数组的对象元素中读取哪个属性作为图片地址
-        keyName: {
-            type: String,
-            default: uni.$u.props.avatarGroup.keyName
-        },
-		// 头像之间的遮挡比例
-        gap: {
-            type: [String, Number],
-            validator(value) {
-                return value >= 0 && value <= 1
-            },
-            default: uni.$u.props.avatarGroup.gap
-        },
-		// 需额外显示的值
-		extraValue: {
-			type: [Number, String],
-			default: uni.$u.props.avatarGroup.extraValue
-		}
-    }
-}

+ 0 - 103
app/uni_modules/uview-ui/components/u-avatar-group/u-avatar-group.vue

@@ -1,103 +0,0 @@
-<template>
-	<view class="u-avatar-group">
-		<view
-		    class="u-avatar-group__item"
-		    v-for="(item, index) in showUrl"
-		    :key="index"
-		    :style="{
-				marginLeft: index === 0 ? 0 : $u.addUnit(-size * gap)
-			}"
-		>
-			<u-avatar
-			    :size="size"
-			    :shape="shape"
-			    :mode="mode"
-			    :src="$u.test.object(item) ? keyName && item[keyName] || item.url : item"
-			></u-avatar>
-			<view
-			    class="u-avatar-group__item__show-more"
-			    v-if="showMore && index === showUrl.length - 1 && (urls.length > maxCount || extraValue > 0)"
-				@tap="clickHandler"
-			>
-				<u--text
-				    color="#ffffff"
-				    :size="size * 0.4"
-				    :text="`+${extraValue || urls.length - showUrl.length}`"
-					align="center"
-					customStyle="justify-content: center"
-				></u--text>
-			</view>
-		</view>
-	</view>
-</template>
-
-<script>
-	import props from './props.js';
-	/**
-	 * AvatarGroup  头像组
-	 * @description 本组件一般用于展示头像的地方,如个人中心,或者评论列表页的用户头像展示等场所。
-	 * @tutorial https://www.uviewui.com/components/avatar.html
-	 * 
-	 * @property {Array}           urls     头像图片组 (默认 [] )
-	 * @property {String | Number} maxCount 最多展示的头像数量 ( 默认 5 )
-	 * @property {String}          shape    头像形状( 'circle' (默认) | 'square' )
-	 * @property {String}          mode     图片裁剪模式(默认 'scaleToFill' )
-	 * @property {Boolean}         showMore 超出maxCount时是否显示查看更多的提示 (默认 true )
-	 * @property {String | Number} size      头像大小 (默认 40 )
-	 * @property {String}          keyName  指定从数组的对象元素中读取哪个属性作为图片地址 
-	 * @property {String | Number} gap      头像之间的遮挡比例(0.4代表遮挡40%)  (默认 0.5 )
-	 * @property {String | Number} extraValue  需额外显示的值
-	 * @event    {Function}        showMore 头像组更多点击
-	 * @example  <u-avatar-group:urls="urls" size="35" gap="0.4" ></u-avatar-group:urls=>
-	 */
-	export default {
-		name: 'u-avatar-group',
-		mixins: [uni.$u.mpMixin, uni.$u.mixin, props],
-		data() {
-			return {
-
-			}
-		},
-		computed: {
-			showUrl() {
-				return this.urls.slice(0, this.maxCount)
-			}
-		},
-		methods: {
-			clickHandler() {
-				this.$emit('showMore')
-			}
-		},
-	}
-</script>
-
-<style lang="scss" scoped>
-	@import "../../libs/css/components.scss";
-
-	.u-avatar-group {
-		@include flex;
-
-		&__item {
-			margin-left: -10px;
-			position: relative;
-
-			&--no-indent {
-				// 如果你想质疑作者不会使用:first-child,说明你太年轻,因为nvue不支持
-				margin-left: 0;
-			}
-
-			&__show-more {
-				position: absolute;
-				top: 0;
-				bottom: 0;
-				left: 0;
-				right: 0;
-				background-color: rgba(0, 0, 0, 0.3);
-				@include flex;
-				align-items: center;
-				justify-content: center;
-				border-radius: 100px;
-			}
-		}
-	}
-</style>

+ 0 - 78
app/uni_modules/uview-ui/components/u-avatar/props.js

@@ -1,78 +0,0 @@
-export default {
-    props: {
-        // 头像图片路径(不能为相对路径)
-        src: {
-            type: String,
-            default: uni.$u.props.avatar.src
-        },
-        // 头像形状,circle-圆形,square-方形
-        shape: {
-            type: String,
-            default: uni.$u.props.avatar.shape
-        },
-        // 头像尺寸
-        size: {
-            type: [String, Number],
-            default: uni.$u.props.avatar.size
-        },
-        // 裁剪模式
-        mode: {
-            type: String,
-            default: uni.$u.props.avatar.mode
-        },
-        // 显示的文字
-        text: {
-            type: String,
-            default: uni.$u.props.avatar.text
-        },
-        // 背景色
-        bgColor: {
-            type: String,
-            default: uni.$u.props.avatar.bgColor
-        },
-        // 文字颜色
-        color: {
-            type: String,
-            default: uni.$u.props.avatar.color
-        },
-        // 文字大小
-        fontSize: {
-            type: [String, Number],
-            default: uni.$u.props.avatar.fontSize
-        },
-        // 显示的图标
-        icon: {
-            type: String,
-            default: uni.$u.props.avatar.icon
-        },
-        // 显示小程序头像,只对百度,微信,QQ小程序有效
-        mpAvatar: {
-            type: Boolean,
-            default: uni.$u.props.avatar.mpAvatar
-        },
-        // 是否使用随机背景色
-        randomBgColor: {
-            type: Boolean,
-            default: uni.$u.props.avatar.randomBgColor
-        },
-        // 加载失败的默认头像(组件有内置默认图片)
-        defaultUrl: {
-            type: String,
-            default: uni.$u.props.avatar.defaultUrl
-        },
-        // 如果配置了randomBgColor为true,且配置了此值,则从默认的背景色数组中取出对应索引的颜色值,取值0-19之间
-        colorIndex: {
-            type: [String, Number],
-            // 校验参数规则,索引在0-19之间
-            validator(n) {
-                return uni.$u.test.range(n, [0, 19]) || n === ''
-            },
-            default: uni.$u.props.avatar.colorIndex
-        },
-        // 组件标识符
-        name: {
-            type: String,
-            default: uni.$u.props.avatar.name
-        }
-    }
-}

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 58
app/uni_modules/uview-ui/components/u-avatar/u-avatar.vue


+ 0 - 14
app/uni_modules/uview-ui/components/u-grid-item/props.js

@@ -1,14 +0,0 @@
-export default {
-    props: {
-        // 宫格的name
-        name: {
-            type: [String, Number, null],
-            default: uni.$u.props.gridItem.name
-        },
-        // 背景颜色
-        bgColor: {
-            type: String,
-            default: uni.$u.props.gridItem.bgColor
-        }
-    }
-}

+ 0 - 209
app/uni_modules/uview-ui/components/u-grid-item/u-grid-item.vue

@@ -1,209 +0,0 @@
-<template>
-	<!-- #ifndef APP-NVUE -->
-	<view
-	    class="u-grid-item"
-	    hover-class="u-grid-item--hover-class"
-	    :hover-stay-time="200"
-	    @tap="clickHandler"
-	    :class="classes"
-	    :style="[itemStyle]"
-	>
-		<slot />
-	</view>
-	<!-- #endif -->
-	<!-- #ifdef APP-NVUE -->
-	<view
-	    class="u-grid-item"
-	    :hover-stay-time="200"
-	    @tap="clickHandler"
-	    :class="classes"
-	    :style="[itemStyle]"
-	>
-		<slot />
-	</view>
-	<!-- #endif -->
-</template>
-
-<script>
-	import props from './props.js';
-	/**
-	 * gridItem 提示
-	 * @description 宫格组件一般用于同时展示多个同类项目的场景,可以给宫格的项目设置徽标组件(badge),或者图标等,也可以扩展为左右滑动的轮播形式。搭配u-grid使用
-	 * @tutorial https://www.uviewui.com/components/grid.html
-	 * @property {String | Number}	name		宫格的name ( 默认 null )
-	 * @property {String}			bgColor		宫格的背景颜色 (默认 'transparent' )
-	 * @property {Object}			customStyle	自定义样式,对象形式
-	 * @event {Function} click 点击宫格触发
-	 * @example <u-grid-item></u-grid-item>
-	 */
-	export default {
-		name: "u-grid-item",
-		mixins: [uni.$u.mpMixin, uni.$u.mixin,props],
-		data() {
-			return {
-				parentData: {
-					col: 3, // 父组件划分的宫格数
-					border: true, // 是否显示边框,根据父组件决定
-				},
-				// #ifdef APP-NVUE
-				width: 0, // nvue下才这么计算,vue下放到computed中,否则会因为延时造成闪烁
-				// #endif
-				classes: [], // 类名集合,用于判断是否显示右边和下边框
-			};
-		},
-		mounted() {
-			this.init()
-		},
-		computed: {
-			// #ifndef APP-NVUE
-			// vue下放到computed中,否则会因为延时造成闪烁
-			width() {
-				return 100 / Number(this.parentData.col) + '%'
-			},
-			// #endif
-			itemStyle() {
-				const style = {
-					background: this.bgColor,
-					width: this.width
-				}
-				return uni.$u.deepMerge(style, uni.$u.addStyle(this.customStyle))
-			}
-		},
-		methods: {
-			init() {
-				// 用于在父组件u-grid的children中被添加入子组件时,
-				// 重新计算item的边框
-				uni.$on('$uGridItem', () => {
-					this.gridItemClasses()
-				})
-				// 父组件的实例
-				this.updateParentData()
-				// #ifdef APP-NVUE
-				// 获取元素该有的长度,nvue下要延时才准确
-				this.$nextTick(function(){
-					this.getItemWidth()
-				})
-				// #endif
-				// 发出事件,通知所有的grid-item都重新计算自己的边框
-				uni.$emit('$uGridItem')
-				this.gridItemClasses()
-			},
-			// 获取父组件的参数
-			updateParentData() {
-				// 此方法写在mixin中
-				this.getParentData('u-grid');
-			},
-			clickHandler() {
-				let name = this.name
-				// 如果没有设置name属性,历遍父组件的children数组,判断当前的元素是否和本实例this相等,找出当前组件的索引
-				const children = this.parent?.children
-				if(children && this.name === null) {
-					name = children.findIndex(child => child === this)
-				}
-				// 调用父组件方法,发出事件
-				this.parent && this.parent.childClick(name)
-				this.$emit('click', name)
-			},
-			async getItemWidth() {
-				// 如果是nvue,不能使用百分比,只能使用固定宽度
-				let width = 0
-				if(this.parent) {
-					// 获取父组件宽度后,除以栅格数,得出每个item的宽度
-					const parentWidth = await this.getParentWidth()
-					width = parentWidth / Number(this.parentData.col) + 'px'
-				}
-				this.width = width
-			},
-			// 获取父元素的尺寸
-			getParentWidth() {
-				// #ifdef APP-NVUE
-				// 返回一个promise,让调用者可以用await同步获取
-				const dom = uni.requireNativePlugin('dom')
-				return new Promise(resolve => {
-					// 调用父组件的ref
-					dom.getComponentRect(this.parent.$refs['u-grid'], res => {
-						resolve(res.size.width)
-					})
-				})
-				// #endif
-			},
-			gridItemClasses() {
-				if(this.parentData.border) {
-					const classes = []
-					this.parent.children.map((child, index) =>{
-						if(this === child) {
-							const len = this.parent.children.length
-							// 贴近右边屏幕边沿的child,并且最后一个(比如只有横向2个的时候),无需右边框
-							if((index + 1) % this.parentData.col !== 0 && index + 1 !== len) {
-								classes.push('u-border-right')
-							}
-							// 总的宫格数量对列数取余的值
-							// 如果取余后,值为0,则意味着要将最后一排的宫格,都不需要下边框
-							const lessNum = len % this.parentData.col === 0 ? this.parentData.col : len % this.parentData.col
-							// 最下面的一排child,无需下边框
-							if(index < len - lessNum) {
-								classes.push('u-border-bottom')
-							}
-						}
-					})
-					// 支付宝,头条小程序无法动态绑定一个数组类名,否则解析出来的结果会带有",",而导致失效
-					// #ifdef MP-ALIPAY || MP-TOUTIAO
-					classes = classes.join(' ')
-					// #endif
-					this.classes = classes
-				}
-			}
-		},
-		beforeDestroy() {
-			// 移除事件监听,释放性能
-			uni.$off('$uGridItem')
-		}
-	};
-</script>
-
-<style lang="scss" scoped>
-	@import "../../libs/css/components.scss";
-      $u-grid-item-hover-class-opcatiy:.5 !default;
-      $u-grid-item-margin-top:1rpx !default;
-      $u-grid-item-border-right-width:0.5px !default;
-      $u-grid-item-border-bottom-width:0.5px !default;
-      $u-grid-item-border-right-color:$u-border-color !default;
-      $u-grid-item-border-bottom-color:$u-border-color !default;
-	.u-grid-item {
-		align-items: center;
-		justify-content: center;
-		position: relative;
-		flex-direction: column;
-		/* #ifndef APP-NVUE */
-		box-sizing: border-box;
-		display: flex;
-		/* #endif */
-
-		/* #ifdef MP */
-		position: relative;
-		float: left;
-		/* #endif */
-
-		/* #ifdef MP-WEIXIN */
-		margin-top:$u-grid-item-margin-top;
-		/* #endif */
-
-		&--hover-class {
-			opacity:$u-grid-item-hover-class-opcatiy;
-		}
-	}
-
-	/* #ifdef APP-NVUE */
-	// 由于nvue不支持组件内引入app.vue中再引入的样式,所以需要写在这里
-	.u-border-right {
-		border-right-width:$u-grid-item-border-right-width;
-		border-color: $u-grid-item-border-right-color;
-	}
-
-	.u-border-bottom {
-		border-bottom-width:$u-grid-item-border-bottom-width;
-		border-color:$u-grid-item-border-bottom-color;
-	}
-
-	/* #endif */
-</style>

+ 0 - 19
app/uni_modules/uview-ui/components/u-grid/props.js

@@ -1,19 +0,0 @@
-export default {
-    props: {
-        // 分成几列
-        col: {
-            type: [String, Number],
-            default: uni.$u.props.grid.col
-        },
-        // 是否显示边框
-        border: {
-            type: Boolean,
-            default: uni.$u.props.grid.border
-        },
-        // 宫格对齐方式,表现为数量少的时候,靠左,居中,还是靠右
-        align: {
-            type: String,
-            default: uni.$u.props.grid.align
-        }
-    }
-}

+ 0 - 97
app/uni_modules/uview-ui/components/u-grid/u-grid.vue

@@ -1,97 +0,0 @@
-<template>
-	<view
-	    class="u-grid"
-		ref='u-grid'
-	    :style="[gridStyle]"
-	>
-		<slot />
-	</view>
-</template>
-
-<script>
-	import props from './props.js';
-	/**
-	 * grid 宫格布局
-	 * @description 宫格组件一般用于同时展示多个同类项目的场景,可以给宫格的项目设置徽标组件(badge),或者图标等,也可以扩展为左右滑动的轮播形式。
-	 * @tutorial https://www.uviewui.com/components/grid.html
-	 * @property {String | Number}	col			宫格的列数(默认 3 )
-	 * @property {Boolean}			border		是否显示宫格的边框(默认 false )
-	 * @property {String}			align		宫格对齐方式,表现为数量少的时候,靠左,居中,还是靠右 (默认 'left' )
-	 * @property {Object}			customStyle	定义需要用到的外部样式
-	 * @event {Function} click 点击宫格触发
-	 * @example <u-grid :col="3" @click="click"></u-grid>
-	 */
-	export default {
-		name: 'u-grid',
-		mixins: [uni.$u.mpMixin, uni.$u.mixin,props],
-		data() {
-			return {
-				index: 0,
-				width: 0
-			}
-		},
-		watch: {
-			// 当父组件需要子组件需要共享的参数发生了变化,手动通知子组件
-			parentData() {
-				if (this.children.length) {
-					this.children.map(child => {
-						// 判断子组件(u-radio)如果有updateParentData方法的话,就就执行(执行的结果是子组件重新从父组件拉取了最新的值)
-						typeof(child.updateParentData) == 'function' && child.updateParentData();
-					})
-				}
-			},
-		},
-		created() {
-			// 如果将children定义在data中,在微信小程序会造成循环引用而报错
-			this.children = []
-		},
-		computed: {
-			// 计算父组件的值是否发生变化
-			parentData() {
-				return [this.hoverClass, this.col, this.size, this.border];
-			},
-			// 宫格对齐方式
-			gridStyle() {
-				let style = {};
-				switch (this.align) {
-					case 'left':
-						style.justifyContent = 'flex-start';
-						break;
-					case 'center':
-						style.justifyContent = 'center';
-						break;
-					case 'right':
-						style.justifyContent = 'flex-end';
-						break;
-					default:
-						style.justifyContent = 'flex-start';
-				};
-				return uni.$u.deepMerge(style, uni.$u.addStyle(this.customStyle));
-			}
-		},
-		methods: {
-			// 此方法由u-grid-item触发,用于在u-grid发出事件
-			childClick(name) {
-				this.$emit('click', name)
-			}
-		}
-	};
-</script>
-
-<style lang="scss" scoped>
-	@import "../../libs/css/components.scss";
-     $u-grid-width:100% !default;
-	.u-grid {
-		/* #ifdef MP */
-		width: $u-grid-width;
-		position: relative;
-		box-sizing: border-box;
-		overflow: hidden;
-		display: block;
-		/* #endif */
-		justify-content: center;
-		@include flex;
-		flex-wrap: wrap;
-		align-items: center;
-	}
-</style>

+ 0 - 84
app/uni_modules/uview-ui/components/u-keyboard/props.js

@@ -1,84 +0,0 @@
-export default {
-    props: {
-        // 键盘的类型,number-数字键盘,card-身份证键盘,car-车牌号键盘
-        mode: {
-            type: String,
-            default: uni.$u.props.keyboard.mode
-        },
-        // 是否显示键盘的"."符号
-        dotDisabled: {
-            type: Boolean,
-            default: uni.$u.props.keyboard.dotDisabled
-        },
-        // 是否显示顶部工具条
-        tooltip: {
-            type: Boolean,
-            default: uni.$u.props.keyboard.tooltip
-        },
-        // 是否显示工具条中间的提示
-        showTips: {
-            type: Boolean,
-            default: uni.$u.props.keyboard.showTips
-        },
-        // 工具条中间的提示文字
-        tips: {
-            type: String,
-            default: uni.$u.props.keyboard.tips
-        },
-        // 是否显示工具条左边的"取消"按钮
-        showCancel: {
-            type: Boolean,
-            default: uni.$u.props.keyboard.showCancel
-        },
-        // 是否显示工具条右边的"完成"按钮
-        showConfirm: {
-            type: Boolean,
-            default: uni.$u.props.keyboard.showConfirm
-        },
-        // 是否打乱键盘按键的顺序
-        random: {
-            type: Boolean,
-            default: uni.$u.props.keyboard.random
-        },
-        // 是否开启底部安全区适配,开启的话,会在iPhoneX机型底部添加一定的内边距
-        safeAreaInsetBottom: {
-            type: Boolean,
-            default: uni.$u.props.keyboard.safeAreaInsetBottom
-        },
-        // 是否允许通过点击遮罩关闭键盘
-        closeOnClickOverlay: {
-            type: Boolean,
-            default: uni.$u.props.keyboard.closeOnClickOverlay
-        },
-        // 控制键盘的弹出与收起
-        show: {
-            type: Boolean,
-            default: uni.$u.props.keyboard.show
-        },
-        // 是否显示遮罩,某些时候数字键盘时,用户希望看到自己的数值,所以可能不想要遮罩
-        overlay: {
-            type: Boolean,
-            default: uni.$u.props.keyboard.overlay
-        },
-        // z-index值
-        zIndex: {
-            type: [String, Number],
-            default: uni.$u.props.keyboard.zIndex
-        },
-        // 取消按钮的文字
-        cancelText: {
-            type: String,
-            default: uni.$u.props.keyboard.cancelText
-        },
-        // 确认按钮的文字
-        confirmText: {
-            type: String,
-            default: uni.$u.props.keyboard.confirmText
-        },
-        // 输入一个中文后,是否自动切换到英文
-        autoChange: {
-            type: Boolean,
-            default: uni.$u.props.keyboard.autoChange
-        }
-    }
-}

+ 0 - 164
app/uni_modules/uview-ui/components/u-keyboard/u-keyboard.vue

@@ -1,164 +0,0 @@
-<template>
-	<u-popup
-	    :overlay="overlay"
-	    :closeOnClickOverlay="closeOnClickOverlay"
-	    mode="bottom"
-	    :popup="false"
-	    :show="show"
-	    :safeAreaInsetBottom="safeAreaInsetBottom"
-	    @close="popupClose"
-	    :zIndex="zIndex"
-	    :customStyle="{
-			backgroundColor: 'rgb(214, 218, 220)'
-		}"
-	>
-		<view class="u-keyboard">
-			<slot />
-			<view
-			    class="u-keyboard__tooltip"
-			    v-if="tooltip"
-			>
-				<view
-				    hover-class="u-hover-class"
-				    :hover-stay-time="100"
-				>
-					<text
-					    class="u-keyboard__tooltip__item u-keyboard__tooltip__cancel"
-					    v-if="showCancel"
-					    @tap="onCancel"
-					>{{showCancel && cancelText}}</text>
-				</view>
-				<view>
-					<text
-					    v-if="showTips"
-					    class="u-keyboard__tooltip__item u-keyboard__tooltip__tips"
-					>{{tips ? tips : mode == 'number' ? '数字键盘' : mode == 'card' ? '身份证键盘' : '车牌号键盘'}}</text>
-				</view>
-				<view
-				    hover-class="u-hover-class"
-				    :hover-stay-time="100"
-				>
-					<text
-					    v-if="showConfirm"
-					    @tap="onConfirm"
-					    class="u-keyboard__tooltip__item u-keyboard__tooltip__submit"
-					    hover-class="u-hover-class"
-					>{{showConfirm && confirmText}}</text>
-				</view>
-			</view>
-			<template v-if="mode == 'number' || mode == 'card'">
-				<u-number-keyboard
-				    :random="random"
-				    @backspace="backspace"
-				    @change="change"
-				    :mode="mode"
-				    :dotDisabled="dotDisabled"
-				></u-number-keyboard>
-			</template>
-			<template v-else>
-				<u-car-keyboard
-				    :random="random"
-					:autoChange="autoChange"
-				    @backspace="backspace"
-				    @change="change"
-				></u-car-keyboard>
-			</template>
-		</view>
-	</u-popup>
-</template>
-
-<script>
-	import props from './props.js';
-
-	/**
-	 * keyboard 键盘
-	 * @description 此为uViw自定义的键盘面板,内含了数字键盘,车牌号键,身份证号键盘3中模式,都有可以打乱按键顺序的选项。
-	 * @tutorial https://www.uviewui.com/components/keyboard.html
-	 * @property {String}			mode				键盘类型,见官网基本使用的说明 (默认 'number' )
-	 * @property {Boolean}			dotDisabled			是否显示"."按键,只在mode=number时有效 (默认 false )
-	 * @property {Boolean}			tooltip				是否显示键盘顶部工具条 (默认 true )
-	 * @property {Boolean}			showTips			是否显示工具条中间的提示 (默认 true )
-	 * @property {String}			tips				工具条中间的提示文字,见上方基本使用的说明,如不需要,请传""空字符
-	 * @property {Boolean}			showCancel			是否显示工具条左边的"取消"按钮 (默认 true )
-	 * @property {Boolean}			showConfirm			是否显示工具条右边的"完成"按钮( 默认 true )
-	 * @property {Boolean}			random				是否打乱键盘按键的顺序 (默认 false )
-	 * @property {Boolean}			safeAreaInsetBottom	是否开启底部安全区适配 (默认 true )
-	 * @property {Boolean}			closeOnClickOverlay	是否允许点击遮罩收起键盘 (默认 true )
-	 * @property {Boolean}			show				控制键盘的弹出与收起(默认 false )
-	 * @property {Boolean}			overlay				是否显示遮罩 (默认 true )
-	 * @property {String | Number}	zIndex				弹出键盘的z-index值 (默认 1075 )
-	 * @property {String}			cancelText			取消按钮的文字 (默认 '取消' )
-	 * @property {String}			confirmText			确认按钮的文字 (默认 '确认' )
-	 * @property {Object}			customStyle			自定义样式,对象形式
-	 * @event {Function} change 按键被点击(不包含退格键被点击)
-	 * @event {Function} cancel 键盘顶部工具条左边的"取消"按钮被点击
-	 * @event {Function} confirm 键盘顶部工具条右边的"完成"按钮被点击
-	 * @event {Function} backspace 键盘退格键被点击
-	 * @example <u-keyboard mode="number" v-model="show"></u-keyboard>
-	 */
-	export default {
-		name: "u-keyboard",
-		data() {
-			return {
-
-			}
-		},
-		mixins: [uni.$u.mpMixin, uni.$u.mixin,props],
-		methods: {
-			change(e) {
-				this.$emit('change', e);
-			},
-			// 键盘关闭
-			popupClose() {
-				this.$emit('close');
-			},
-			// 输入完成
-			onConfirm() {
-				this.$emit('confirm');
-			},
-			// 取消输入
-			onCancel() {
-				this.$emit('cancel');
-			},
-			// 退格键
-			backspace() {
-				this.$emit('backspace');
-			}
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-	@import "../../libs/css/components.scss";
-
-	.u-keyboard {
-
-		&__tooltip {
-			@include flex;
-			justify-content: space-between;
-			background-color: #FFFFFF;
-			padding: 14px 12px;
-
-			&__item {
-				color: #333333;
-				flex: 1;
-				text-align: center;
-				font-size: 15px;
-			}
-
-			&__submit {
-				text-align: right;
-				color: $u-primary;
-			}
-
-			&__cancel {
-				text-align: left;
-				color: #888888;
-			}
-
-			&__tips {
-				color: $u-tips-color;
-			}
-		}
-	}
-</style>

+ 6 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/api/Api_PayController.java

@@ -7,6 +7,7 @@ import com.ruoyi.common.core.redis.RedisCache;
 import com.ruoyi.web.work.api.config.BaseController;
 import com.ruoyi.web.work.domain.Pay;
 import com.ruoyi.web.work.domain.Platform;
+import com.ruoyi.web.work.domain.dto.PayAddDto;
 import com.ruoyi.web.work.domain.dto.PayCashOutDto;
 import com.ruoyi.web.work.service.IPayService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -45,6 +46,11 @@ public class Api_PayController extends BaseController {
         return AjaxResult.success(platform);
     }
 
+    @PostMapping("/add")
+    public AjaxResult add(@Validated @RequestBody PayAddDto dto) throws ServerException {
+        return payService.add(dto);
+    }
+
     @PostMapping("/cashOut")
     public AjaxResult cashOut(@Validated @RequestBody PayCashOutDto dto) throws ServerException {
         return payService.cashOut(dto);

+ 7 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/controller/PayController.java

@@ -55,4 +55,11 @@ public class PayController extends BaseController {
         return payService.audit(dto);
     }
 
+    @PreAuthorize("@ss.hasPermi('work:pay:confirm')")
+    @Log(title = "充值确认", businessType = BusinessType.UPDATE)
+    @PostMapping("/confirm")
+    public AjaxResult confirm(@Validated @RequestBody PayAuditDto dto) throws Exception {
+        return payService.confirm(dto);
+    }
+
 }

+ 6 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/Pay.java

@@ -49,6 +49,12 @@ public class Pay extends BaseData {
     @ApiModelProperty(value = "提现方式:0=提现到银行卡,1=提现到微信")
     private Integer way;
 
+    @ApiModelProperty(value = "充值方式:0=微信,1=转账")
+    private Integer payWay;
+
+    @ApiModelProperty(value = "充值凭证")
+    private String certificate;
+
     @ApiModelProperty(value = "原因")
     private String msg;
 

+ 23 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/dto/PayAddDto.java

@@ -0,0 +1,23 @@
+package com.ruoyi.web.work.domain.dto;
+
+import lombok.Data;
+
+import javax.validation.constraints.DecimalMin;
+import javax.validation.constraints.Digits;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+
+@Data
+public class PayAddDto {
+
+    @NotNull(message = "充值金额不能为空")
+    @Digits(integer = 10, fraction = 2, message = "充值金额只能包含最多两位小数")
+    @DecimalMin(value = "0.01", message = "充值金额必须大于0")
+    private BigDecimal money;
+
+
+    @NotBlank(message = "充值凭证不能为空")
+    private String certificate;
+
+}

+ 21 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/service/IPayService.java

@@ -3,6 +3,7 @@ package com.ruoyi.web.work.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.web.work.domain.Pay;
+import com.ruoyi.web.work.domain.dto.PayAddDto;
 import com.ruoyi.web.work.domain.dto.PayAuditDto;
 import com.ruoyi.web.work.domain.dto.PayCashOutDto;
 
@@ -34,6 +35,26 @@ public interface IPayService extends IService<Pay> {
      */
     AjaxResult audit(PayAuditDto dto) throws Exception;
 
+    /**
+     * 推送提现结果
+     *
+     * @param pay
+     */
     public void sendMessage(Pay pay);
 
+    /**
+     * 余额转账充值
+     *
+     * @param dto
+     * @return
+     */
+    AjaxResult add(PayAddDto dto) throws ServerException;
+
+    /**
+     * 账户充值确认
+     *
+     * @param dto
+     * @return
+     */
+    AjaxResult confirm(PayAuditDto dto) throws ServerException;
 }

+ 52 - 3
ruoyi-admin/src/main/java/com/ruoyi/web/work/service/impl/PayServiceImpl.java

@@ -23,12 +23,14 @@ import com.ruoyi.web.work.api.util.AppUtil;
 import com.ruoyi.web.work.domain.Pay;
 import com.ruoyi.web.work.domain.Platform;
 import com.ruoyi.web.work.domain.User;
+import com.ruoyi.web.work.domain.dto.PayAddDto;
 import com.ruoyi.web.work.domain.dto.PayAuditDto;
 import com.ruoyi.web.work.domain.dto.PayCashOutDto;
 import com.ruoyi.web.work.mapper.PayMapper;
 import com.ruoyi.web.work.service.IPayService;
 import com.ruoyi.web.work.service.IUserService;
 import com.ruoyi.web.work.wxpay.WxPayBean;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
 import org.springframework.stereotype.Service;
@@ -86,7 +88,10 @@ public class PayServiceImpl extends ServiceImpl<PayMapper, Pay> implements IPayS
             return AjaxResult.error("银行卡信息未完善,无法提现");
         }
         if (dto.getMoney().compareTo(platform.getCashOutMoney()) < 0) {
-            return AjaxResult.error("最少提现金额:" + platform.getCashOutMoney() + "起");
+            return AjaxResult.error("最少提现金额(¥):" + platform.getCashOutMoney() + "起");
+        }
+        if (platform.getCashOutMaxMoney() != null && dto.getMoney().compareTo(platform.getCashOutMaxMoney()) > 0) {
+            return AjaxResult.error("提现金额超过最大提现金额(¥):" + platform.getCashOutMaxMoney());
         }
         if (dto.getMoney().compareTo(user.getMoney()) > 0) {
             return AjaxResult.error("提现金额超过账户余额");
@@ -129,7 +134,7 @@ public class PayServiceImpl extends ServiceImpl<PayMapper, Pay> implements IPayS
         if (pay == null || pay.getType() != 2) {
             return AjaxResult.error("提现信息不存在");
         }
-        if (pay.getState() == 1) {
+        if (pay.getState() != 0) {
             return AjaxResult.error("不能重复操作");
         }
         pay.setState(dto.getState());
@@ -148,7 +153,7 @@ public class PayServiceImpl extends ServiceImpl<PayMapper, Pay> implements IPayS
         }
         //转账到微信零钱
         if (pay.getWay() == 1 && pay.getState() == 1) {
-            BigDecimal money =(pay.getMoney().subtract(pay.getServiceMoney())).multiply(new BigDecimal("100"));
+            BigDecimal money = (pay.getMoney().subtract(pay.getServiceMoney())).multiply(new BigDecimal("100"));
             BatchTransferModel batchTransferModel = new BatchTransferModel().setAppid(wxPayV3Bean.getAppId()).setOut_batch_no(PayKit.generateStr()).setBatch_name("账户余额提现到零钱").setBatch_remark("账户余额提现到零钱").setTotal_amount(money.intValue()).setTotal_num(1).setTransfer_detail_list(Collections.singletonList(new TransferDetailInput().setOut_detail_no(PayKit.generateStr()).setTransfer_amount(money.intValue()).setTransfer_remark("账户余额提现到零钱").setOpenid(user.getOpenId())));
             IJPayHttpResponse response = WxPayApi.v3(RequestMethodEnum.POST, WxDomainEnum.CHINA.toString(), TransferApiEnum.TRANSFER_BATCHES.toString(), wxPayV3Bean.getMchId(), getSerialNumber(), null, wxPayV3Bean.getKeyPath(), JSONUtil.toJsonStr(batchTransferModel));
             String body = response.getBody();
@@ -199,6 +204,50 @@ public class PayServiceImpl extends ServiceImpl<PayMapper, Pay> implements IPayS
         System.out.println("小程序订阅消息:" + result);
     }
 
+    @Override
+    public AjaxResult add(PayAddDto dto) throws ServerException {
+        Pay pay = new Pay();
+        BeanUtils.copyProperties(dto, pay);
+        pay.setUserId(AppUtil.getUser().getId());
+        pay.setState(0);
+        pay.setTitle("转账充值");
+        pay.setType(0);
+        pay.setPayWay(1);
+        pay.setNums(PayKit.generateStr());
+        if (!save(pay)) {
+            throw new ServerException("金额充值失败,请联系平台客服");
+        }
+        return AjaxResult.success();
+    }
+
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public AjaxResult confirm(PayAuditDto dto) throws ServerException {
+        Pay pay = getById(dto.getId());
+        if (pay == null || pay.getPayWay() != 1) {
+            return AjaxResult.error("充值信息不存在");
+        }
+        if (pay.getState() != 0) {
+            return AjaxResult.error("不能重复操作");
+        }
+        pay.setState(dto.getState());
+        pay.setMsg(dto.getMsg());
+        pay.setCompleteTime(new Date());
+        if (!updateById(pay)) {
+            throw new ServerException("充值失败,请联系平台");
+        }
+        User user = userService.getById(pay.getUserId());
+        //充值确认给用户账户充值
+        if (user != null && dto.getState() == 1) {
+            user.setMoney(user.getMoney().add(pay.getMoney()));
+            if (!userService.updateById(user)) {
+                throw new ServerException("更新用户账户余额失败,请联系平台");
+            }
+        }
+        return AjaxResult.success();
+    }
+
     private String getSerialNumber() {
         if (StrUtil.isEmpty(serialNo)) {
             X509Certificate certificate = PayKit.getCertificate(wxPayV3Bean.getCertPath());

+ 3 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/service/impl/TaskListServiceImpl.java

@@ -39,6 +39,9 @@ public class TaskListServiceImpl extends ServiceImpl<TaskListMapper, TaskList> i
         if (resumeDeliver == null || !resumeDeliver.getUserId().equals(AppUtil.getUser().getId())) {
             return AjaxResult.error("兼职任务不存在或非法操作");
         }
+        if (resumeDeliver.getIsComplete() == 2) {
+            return AjaxResult.error("已完成任务,无法再添加任务进度");
+        }
         TaskList taskList = new TaskList();
         BeanUtils.copyProperties(dto, taskList);
         taskList.setUserId(resumeDeliver.getUserId());

이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.