用工小程序前端代码
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

304 lines
9.0 KiB

3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
  1. <template>
  2. <view class="se-m-10">
  3. <u-sticky>
  4. <view class="se-px-20 se-pt-10 se-zi-s se-bgc-white">
  5. <u-search height="40" placeholder="搜索" :showAction="true" v-model="keyword" @search="onSearch()" @clickIcon="onSearch()" @custom="onSearch()"></u-search>
  6. </view>
  7. <u-tabs
  8. class="se-bgc-white se-pb-20"
  9. :current="current"
  10. lineWidth="30"
  11. lineColor="#FF7A31"
  12. :activeStyle="{
  13. color: '#303133',
  14. fontWeight: 'bold',
  15. transform: 'scale(1.05)'
  16. }"
  17. :inactiveStyle="{
  18. color: '#606266',
  19. transform: 'scale(1)'
  20. }"
  21. itemStyle="padding-left: 15px; padding-right: 15px; height: 34px;"
  22. :list="navList"
  23. @click="navClick($event)">
  24. </u-tabs>
  25. </u-sticky>
  26. <template v-if="current==1">
  27. <view class="se-m-20 se-br-20 se-bs-b se-bgc-white se-py-20 se-px-30" v-for="(items,indexs) in tList" :key="indexs" @click="onTaskDetail(items)">
  28. <view class="se-flex se-flex-h-sb">
  29. <view class="se-flex">
  30. <text class="se-fw-6 se-c-black se-fs-30">{{items.title}}</text>
  31. </view>
  32. <view class="se-c-orange se-fs-32 se-fw-6">
  33. {{items.salaryMin}}-{{items.salaryMax}}k
  34. </view>
  35. </view>
  36. <view class="se-py-10">
  37. <text class="se-c-text-sub se-fs-22 se-mr-10 se-py-5 se-px-20 se-br-5 se-bgc-f5" v-if="items.categoryOne_dictText">{{items.categoryOne_dictText}}</text>
  38. <text class="se-c-text-sub se-fs-22 se-mr-10 se-py-5 se-px-20 se-br-5 se-bgc-f5" v-if="items.categoryTwo_dictText">{{items.categoryTwo_dictText}}</text>
  39. <text class="se-c-text-sub se-fs-22 se-mr-10 se-py-5 se-px-20 se-br-5 se-bgc-f5" v-if="items.payType_dictText">{{items.payType_dictText}}</text>
  40. </view>
  41. <view class="se-flex se-flex-h-sb">
  42. <view class="se-flex se-flex-h-c">
  43. <u-icon name="map"></u-icon>
  44. <text class="se-c-text-sub se-fs-24 se-pr-10">{{items.latitude,items.longitude | getDistance}}km</text>
  45. <text class="se-c-text-sub se-fs-24 se-pl-10 se-b-l se-toe-3" style="max-width: 220rpx;">{{items.address}}</text>
  46. </view>
  47. <view class="se-c-text se-c-text-sub se-fs-24">
  48. {{items.createTime | formatTime}}
  49. </view>
  50. <view class="se-flex se-flex-h-c se-py-10 se-px-20 se-br-12 se-fs-22 se-c-orange se-bgc-ffd se-fw-6">
  51. <text class="se-ml-5">立即接单</text>
  52. </view>
  53. </view>
  54. </view>
  55. <u-empty v-if="tList && tList.length==0" mode="list"></u-empty>
  56. </template>
  57. <template v-if="current==0">
  58. <view class="se-m-20 se-br-20 se-bs-b se-bgc-white se-py-20 se-px-30" v-for="(items,indexs) in rlist" :key="indexs">
  59. <view class="se-flex se-flex-h-sb" @click.capture="onRoleDetail(items)">
  60. <view class="se-flex">
  61. <view class="se-a-80">
  62. <image class="se-a-80 se-br-p-50 se-bgc-f5" :src="items.hanHaiMember.headImage" mode=""></image>
  63. </view>
  64. <view class="se-ml-20 se-flex se-flex-v-c se-flex-ai-fs">
  65. <text class="se-fw-6 se-c-black se-fs-30">{{items.employAuthenticationPerson.name?items.employAuthenticationPerson.name:items.hanHaiMember.nickName}}</text>
  66. <text class="se-fs-24 se-c-text-third">{{items.sex_dictText}}-{{items.nation?items.nation:"未知"}}</text>
  67. </view>
  68. <view class="se-flex se-flex-h-c">
  69. <view class="se-py-10 se-px-20 se-br-12 se-fs-22 se-c-orange se-bgc-ffd se-ml-20 se-fw-6 se-toe-1" style="max-width: 100rpx;">
  70. {{items.categoryOne_dictText}}
  71. </view>
  72. </view>
  73. </view>
  74. <view class="se-c-orange se-fs-32 se-fw-6">
  75. {{items.salaryMin}}-{{items.salaryMax}}
  76. </view>
  77. </view>
  78. <view>
  79. <text class="se-c-text-third se-fs-22 se-mt-10">{{items.createTime}}</text>
  80. </view>
  81. <view class="se-flex se-flex-h-sb">
  82. <text class="se-c-text-sub se-fs-24 se-toe-5">
  83. {{items.categoryTwo_dictText}}
  84. <!-- <u-parse v-if="items.brief" :content="items.brief"></u-parse> -->
  85. </text>
  86. <view @click.capture="onCustomerService(items.employAuthenticationPerson.phone)" class="se-flex se-flex-h-c se-py-10 se-px-20 se-br-12 se-fs-22 se-c-orange se-bgc-ffd se-fw-6">
  87. <u-icon color="#FF7A31" name="phone-fill"></u-icon>
  88. <text class="se-ml-5">联系他</text>
  89. </view>
  90. </view>
  91. </view>
  92. <u-empty v-if="rlist && rlist.length==0" mode="list"></u-empty>
  93. </template>
  94. </view>
  95. </template>
  96. <script>
  97. import {
  98. bannerList,
  99. taskList,
  100. rolelist,
  101. industryList,
  102. getSysText
  103. } from "@/common/api.js"
  104. export default{
  105. data(){
  106. return{
  107. tpageNo:1,
  108. tpageSize:20,
  109. tList:[],
  110. rpageNo:1,
  111. rpageSize:20,
  112. rlist:[],
  113. id:null,
  114. keyword:"",
  115. current:0,
  116. navList:[
  117. {
  118. name: '求职大厅',
  119. },
  120. {
  121. name: '招聘大厅',
  122. }
  123. ],
  124. }
  125. },
  126. onLoad(options) {
  127. this.id=options.id
  128. // this.onTaskList()
  129. this.onRolelist()
  130. },
  131. onReachBottom() {
  132. let that = this
  133. if(that.current==0){
  134. that.rpageNo = that.rpageNo + 1
  135. that.onRolelist()
  136. }else if(that.current==1){
  137. that.tpageNo = that.tpageNo + 1
  138. this.onTaskList()
  139. }
  140. },
  141. onPullDownRefresh() {
  142. let that = this
  143. if(that.current==0){
  144. that.rpageNo = 1
  145. that.rlist=[]
  146. that.onRolelist()
  147. }else if(that.current==1){
  148. that.tpageNo = 1
  149. that.tList = []
  150. this.onTaskList()
  151. }
  152. },
  153. filters:{
  154. formatTime(time) {
  155. const timestamp = new Date(time).getTime();
  156. const currentTime = new Date().getTime();
  157. console.info("currentTime",currentTime)
  158. const diff = (currentTime - timestamp) / 1000; // 时间差,单位:秒
  159. // 计算月差,判断是否超过一个月
  160. const oneMonthInSeconds = 30 * 24 * 60 * 60;
  161. if (diff > oneMonthInSeconds) {
  162. let date = new Date(timestamp);
  163. let year = date.getFullYear();
  164. let month = date.getMonth() + 1;
  165. let day = date.getDate();
  166. if (month < 10) month = "0" + month;
  167. if (day < 10) day = "0" + day;
  168. return `${year}-${month}-${day}`;
  169. } else {
  170. // 计算秒、分钟、小时的差值
  171. if (diff < 60) {
  172. return `${Math.floor(diff)}秒钟前`;
  173. } else if (diff < 60 * 60) {
  174. return `${Math.floor(diff / 60)}分钟前`;
  175. } else if (diff < 60 * 60 * 24) {
  176. return `${Math.floor(diff / 60 / 60)}小时前`;
  177. } else {
  178. // 显示天数
  179. return `${Math.floor(diff / 60 / 60 / 24)}天前`;
  180. }
  181. }
  182. },
  183. formDate(date){
  184. return dayjs(date).format("YYYY-MM-DD").fromNow();
  185. },
  186. getDistance(lat1, lng1) {
  187. let lng2 = uni.getStorageSync("longitude")
  188. let lat2 = uni.getStorageSync("latitude")
  189. if(!lng2 && !lat2){
  190. return "请授权"
  191. }
  192. const R = 6371; // 地球半径,单位:km
  193. const radLat1 = (lat1 * Math.PI) / 180;
  194. const radLat2 = (lat2 * Math.PI) / 180;
  195. const deltaLat = radLat2 - radLat1;
  196. const deltaLng = ((lng2 - lng1) * Math.PI) / 180;
  197. const a =
  198. Math.sin(deltaLat / 2) * Math.sin(deltaLat / 2) +
  199. Math.cos(radLat1) *
  200. Math.cos(radLat2) *
  201. Math.sin(deltaLng / 2) *
  202. Math.sin(deltaLng / 2);
  203. const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
  204. return (R * c).toFixed(2); // 返回保留两位小数的公里数
  205. }
  206. },
  207. methods:{
  208. navClick(event){
  209. this.current=event.index
  210. this.keyword = ""
  211. if(event.index==0){
  212. this.rpageNo=1
  213. this.onRolelist()
  214. }else if(event.index==1){
  215. this.tpageNo=1
  216. this.onTaskList()
  217. }
  218. },
  219. onSearch(){
  220. let that = this
  221. if(that.current==0){
  222. that.rpageNo = 1
  223. that.onRolelist()
  224. }else if(that.current==1){
  225. that.tpageNo = 1
  226. this.onTaskList()
  227. }
  228. },
  229. onRolelist(){
  230. rolelist({
  231. pageNo:this.rpageNo,
  232. pageSize:this.rpageSize,
  233. title:this.keyword,
  234. }).then(response=>{
  235. console.info("response",response)
  236. if(this.rpageNo==1){
  237. this.rlist = response.result.records
  238. }else{
  239. this.rlist = this.rlist.concat(response.result.records)
  240. }
  241. }).catch(error=>{
  242. })
  243. },
  244. onTaskList(){
  245. taskList({
  246. latitude:uni.getStorageSync("latitude"),
  247. longitude:uni.getStorageSync("longitude"),
  248. pageNo:this.tpageNo,
  249. title:this.keyword,
  250. pageSize:this.tpageSize
  251. }).then(response=>{
  252. if(this.tpageNo==1){
  253. this.tList = response.result.records
  254. }else{
  255. this.tList = this.tList.concat(response.result.records)
  256. }
  257. }).catch(error=>{
  258. })
  259. },
  260. onTaskDetail(event){
  261. console.info(event)
  262. uni.navigateTo({
  263. url:"/pages_subpack/work-detail/index?id="+event.id
  264. })
  265. },
  266. onRoleDetail(event){
  267. console.info("event",event)
  268. uni.navigateTo({
  269. url:"/pages_subpack/master-detail/index?id="+event.id
  270. })
  271. },
  272. onCustomerService(phome){
  273. let that = this
  274. // let obj = that.$utils.getkeyContent('phone')
  275. if (uni.canIUse('makePhoneCall')) {
  276. uni.makePhoneCall({
  277. phoneNumber: String(phome),
  278. success: function () {
  279. console.log('拨打电话成功');
  280. },
  281. fail: function () {
  282. console.log('拨打电话失败');
  283. }
  284. });
  285. } else {
  286. console.log('你的设备不支持拨打电话功能');
  287. }
  288. },
  289. }
  290. }
  291. </script>
  292. <style>
  293. </style>