Commit 8713ee22 authored by 李明环(东信)'s avatar 李明环(东信)

页面补全

parent ef8e094b
# 小程序平台模板 vue3
api: lygsh-api.wjzpgz.com
admin 前端: lygsh-admin.wjzpgz.com
admin 后端: lygsh-admin-parent.wjzpgz.com
七牛图片: lygsh-image.wjzpgz.com
## 安装依赖
```
yarn install
```
七牛后台 bucket:lygsh-admin
七牛云图片 bucket:lygsh-images
### 本地服务
```
yarn start
```
### 小程序平台打包
```
yarn build
```
## 默认安装的 UI 库
[wot-design-uni](https://wot-design-uni.netlify.app/component/button.html)
后台登陆默认账号密码:admin/admin123321
......@@ -24,6 +24,7 @@
"@dcloudio/uni-quickapp-webview": "3.0.0-4000720240327002",
"axios": "^1.7.2",
"dayjs": "^1.11.12",
"lodash": "^4.17.21",
"pinia": "2.0.36",
"vue": "^3.3.11",
"vue-i18n": "^9.1.9",
......
......@@ -53,6 +53,12 @@ importers:
axios:
specifier: ^1.7.2
version: 1.7.2
dayjs:
specifier: ^1.11.12
version: 1.11.12
lodash:
specifier: ^4.17.21
version: 4.17.21
pinia:
specifier: 2.0.36
version: 2.0.36(typescript@4.9.5)(vue@3.4.34(typescript@4.9.5))
......@@ -1913,6 +1919,9 @@ packages:
resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==}
engines: {node: '>=10'}
dayjs@1.11.12:
resolution: {integrity: sha512-Rt2g+nTbLlDWZTwwrIXjy9MeiZmSDI375FvZs72ngxx8PDC6YXOeR3q5LAuPzjZQxhiWdRKac7RKV+YyQYfYIg==}
de-indent@1.0.2:
resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==}
......@@ -6707,6 +6716,8 @@ snapshots:
whatwg-mimetype: 2.3.0
whatwg-url: 8.7.0
dayjs@1.11.12: {}
de-indent@1.0.2: {}
debug@2.6.9:
......
......@@ -5,6 +5,25 @@ onLaunch(() => {
onShow(() => {
console.log("App Show");
console.log("============");
/* uni.chooseLocation({
success: function (res) {
console.log("位置名称:" + res.name);
console.log("详细地址:" + res.address);
console.log("纬度:" + res.latitude);
console.log("经度:" + res.longitude);
}
}); */
// uni.getLocation({
// type: "wgs84",
// success: function (res) {
// console.log("当前位置的经度:" + res.longitude);
// console.log("当前位置的纬度:" + res.latitude);
// },
// fail(err) {
// console.log("errerrerr", err);
// }
// });
});
onHide(() => {
......
import instance from "@/utils/request";
//文章分页
export const getArticleListApi = params => instance.post("/article/getPageList", params);
//获取文章i详情
export const getArticleDetailApi = id => instance.post(`/article/detail/${id}`);
//获取文章i详情
export const getArticleTypesApi = type => instance.post(`/article/category/list/${type}`);
......@@ -7,3 +7,5 @@ export const getDictDataApi = params => instance.post("/common/dict/getDictData"
export const getTreeListApi = params => instance.post("/dict/dictProvinceCityDistrict/getTreeList", params);
// 获取岗位列表
export const dictJobTypeApi = params => instance.post("/dict/dictJobType/getTree", params);
// 获取岗位列表类型(1职位,2政策,3动态)
export const getBannerListApi = type => instance.post(`/banner/list/${type}`);
import instance from "@/utils/request";
// 获取职位列表
export const getjobListApi = params => instance.post("/job/getPageList", params);
// 获取职位详情
export const getJobDetailApi = id => instance.post(`/job/detail/${id}`);
// 投递简历
export const submitResumeApi = id => instance.post(`/job/application/${id}`);
// 获取投递
export const getSubmitResumeApi = id => instance.post(`/job/getApplication/${id}`);
// 获取职位详情
export const getCompanyDetailApi = id => instance.post(`/company/detail/${id}`);
// 需求信息分页
export const getNeedListApi = data => instance.post("/need/getPageList", data);
// 需求登记
export const needRegisterApi = id => instance.post(`/need/register/${id}`);
// 获取平台分页 1零工,2其它
export const getPlatformPageList = params => instance.post(`/platform/getPageList`, params);
import instance from "@/utils/request";
// 获取用户简历
export const getUserResumeApi = () => instance.post("/personal/user/resume/get");
// 获取等用户信息
export const getLoginUserApi = () => instance.post("/personal/user/getLoginUser");
// 保存个人优势
export const saveAdvantageApi = params => instance.post("/personal/user/resume/saveAdvantage", params);
// 保存用户求职状态
export const saveJobStatusApi = params => instance.post("/personal/user/resume/saveJobStatus", params);
// 保存用户基本信息
export const saveUserInfoApi = params => instance.post("/personal/user/save", params);
// 保存身份证信息
export const saveIdCardApi = params => instance.post("/personal/user/saveIdCard", params);
// 保存求职意向
export const saveJobIntentionApi = params => instance.post("/personal/user/resume/saveJobIntention", params);
// 保存工作经历
export const saveWorkExperienceApi = params => instance.post("/personal/user/resume/saveWorkExperience", params);
// 保存教育经历
export const saveEducationExperienceApi = params => instance.post("/personal/user/resume/saveEducationExperience", params);
// 获取投递列表
export const getApplicationListApi = params => instance.post("/job/getApplicationList", params);
// 获取面试列表
export const getInterviewListApi = params => instance.post("/job/getInterviewList", params);
<template>
<view class="list">
<view
v-for="(v, i) in list"
:key="i"
@click="navigateTo(`/pages/articleDetails/index?id=${v.id}`)"
class="item flex-between"
:class="[v.infoType == 1 ? 'layout1' : 'layout2']"
>
<img :src="evn.APP_IMAGE_BASE_API + v.thumbnailPath" v-if="v.infoType == 2" />
<view>
<view class="title">{{ v.title }}</view>
<view class="flex-align-center">
<view class="poster">{{ v.author }}</view>
<view class="date">{{ dayjs(v.publishDate).format("YYYY/MM/DD") }}</view>
</view>
</view>
<img :src="evn.APP_IMAGE_BASE_API + v.thumbnailPath" v-if="v.infoType == 1" />
</view>
</view>
</template>
<script setup>
// infoType 1文图 2视频
import { defineProps } from "vue";
import { navigateTo } from "@/utils/utils";
import evn from "@/utils/config";
import dayjs from "dayjs";
const props = defineProps({
list: {
type: Array,
default: () => [
{
type: 2,
title: "2023年贵阳市第四季度供求情况分2023年贵阳市第四季度供求情况分析报告析报告",
poster: "社会保障局",
date: "01-12 12:30"
},
{
type: 1,
title: "2023年贵阳市第四季度供求情况分析报告",
poster: "社会保障局",
date: "01-12 12:30"
}
]
}
});
</script>
<style lang="scss" scoped>
.list {
.item {
padding: 32rpx 0;
margin: 0 32rpx;
border-bottom: 2rpx solid #f3f4f8;
& > view {
flex: 1;
}
img {
width: 202rpx;
height: 114rpx;
margin-left: 24rpx;
}
.title {
margin-bottom: 16rpx;
font-size: 28rpx;
font-weight: 500;
line-height: 36rpx;
color: #000000;
}
.poster,
.date {
margin-right: 16rpx;
font-size: 24rpx;
font-weight: 500;
line-height: 28rpx;
color: #77818f;
letter-spacing: 0rpx;
}
}
.layout2 {
flex-direction: column;
align-items: flex-start;
img {
width: 100%;
height: 294rpx;
margin: 0;
}
.title {
margin-top: 32rpx;
}
}
}
</style>
<template>
<view class="postion-card1" @tap="jump(data.id)">
<view class="flex-between">
<view class="postion-name">{{ data.jobName }}</view>
<view class="salary">{{ data.minSalary / 1000 }}k-{{ data.maxSalary / 1000 }}k<text>/月</text></view>
</view>
<view class="benefits">
<text v-for="(v, i) in data.benefits?.split(',')" :key="i">{{ v }}</text>
</view>
<view class="flex-between">
<text class="company-name">{{ data.companyName }}</text>
<text class="address">贵阳-观山湖区</text>
</view>
</view>
</template>
<script setup>
import { defineProps } from "vue";
const props = defineProps({
data: {
type: Object,
default: () => ({})
},
jump: {
type: Boolean,
default: true
}
});
const jump = id => {
if (props.jump) {
uni.navigateTo({
url: `/pages/postionList/positionDetails/index?id=${id}`
});
}
};
</script>
<style lang="scss" scoped>
.postion-card1 {
.flex-between {
display: flex;
align-items: center;
justify-content: space-between;
}
.postion-name {
font-size: 16px;
font-weight: 600;
line-height: 18px;
color: #1b2026;
}
.salary {
font-size: 18px;
font-weight: 500;
line-height: 12px;
color: #1f86ff;
text-align: center;
letter-spacing: 0;
text {
font-size: 14px;
}
}
.benefits {
display: flex;
gap: 4px;
align-items: center;
margin: 12px 0;
text {
padding: 2px 4px;
font-size: 10px;
line-height: 14px;
color: #4e5969;
background: #f2f3f5;
}
}
.company-name {
font-size: 12px;
font-weight: normal;
line-height: 18px;
color: #1b2026;
letter-spacing: 0;
}
.address {
font-size: 12px;
font-weight: normal;
line-height: 12px;
color: #1b2026;
text-align: center;
letter-spacing: 0;
}
}
</style>
<template>
<view class="steps flex-between">
<view class="item" v-for="(item, index) in stepViewData" :key="index">
<!-- 0 灰色, 1 蓝色 2 红色 -->
<image v-if="item.state == 0" src="@/static/image/postion/step/hookDisabled.png" />
<image v-if="item.state == 1" src="@/static/image/postion/step/hook.png" />
<image v-if="item.state == 2" src="@/static/image/postion/step/fork.png" />
<view
class="title"
:class="{
grey: item.state == 0,
blue: item.state == 1,
red: item.state == 2
}"
>{{ item.title }}</view
>
<view class="date">{{ item.date }}</view>
</view>
<view class="line-wrap">
<view></view>
<view></view>
</view>
</view>
</template>
<script setup>
import { watch, ref } from "vue";
import dayjs from "dayjs";
const props = defineProps({
data: {
type: Object,
default: () => ({})
}
});
const stepViewData = ref([]);
/* 设置步骤条显示数据 */
const setStepViewData = data => {
if (!data) return;
let list = [];
const format = date => dayjs(date).format("MM-DD hh:mm");
list.push({
state: 1,
title: "已投递",
date: format(data.createTime)
});
if (data.status == 1 || data.status == 2 || data.status == 3 || data.status == 4) {
list.push({
state: 1,
title: "已查看",
date: format(data.reviewTime)
});
} else {
list.push({
state: 0,
title: "待查看",
date: ""
});
}
switch (data.status) {
case 2:
list.push({
state: 1,
title: "待面试",
date: format(data.interviewTime)
});
break;
case 3:
list.push({
state: 1,
title: "已面试",
date: format(data.interviewTime)
});
break;
case 4:
list.push({
state: 2,
title: "已拒绝",
date: format(data.interviewTime)
});
break;
default:
list.push({
state: 0,
title: "待反馈",
date: ""
});
break;
}
stepViewData.value = list;
};
watch(
() => props.data,
value => {
if (value) {
setStepViewData(value);
}
},
{
immediate: true
}
);
</script>
<style lang="scss" scoped>
.steps {
position: relative;
box-sizing: border-box;
display: flex;
justify-content: space-between;
width: 750rpx;
padding: 18rpx 60rpx;
.item {
position: relative;
text-align: center;
image {
width: 76rpx;
height: 76rpx;
}
.title {
font-size: 28rpx;
font-weight: 500;
line-height: 36rpx;
}
.blue {
color: #1f86ff;
}
.red {
color: #f63717;
}
.grey {
color: #a3a7b3;
}
.date {
position: absolute;
right: 50%;
font-size: 24rpx;
font-weight: 500;
line-height: 36rpx;
color: #a3a7b3;
letter-spacing: 0rpx;
white-space: nowrap;
transform: translate(50%, 0);
}
}
.line-wrap {
position: absolute;
top: 76rpx;
left: 0;
display: flex;
justify-content: space-evenly;
width: 100%;
view {
width: 80rpx;
height: 2rpx;
background-color: #1f86ff;
}
}
}
</style>
@import "wot-design-uni/components/common/abstracts/variable";
@import "wot-design-uni/components/common/abstracts/mixin";
.wot-theme-dark {
@include b(col-picker) {
@include when(border) {
.wd-col-picker__cell {
@include halfPixelBorder("top", $-cell-padding, $-dark-border-color);
}
}
@include e(label) {
color: $-dark-color;
}
@include e(cell) {
color: $-dark-color;
background-color: $-dark-background2;
@include when(disabled) {
.wd-col-picker__value {
color: $-dark-color3;
}
}
}
@include e(list-item) {
@include when(disabled) {
color: $-dark-color3;
}
}
@include e(list-item-tip) {
color: $-dark-color-gray;
}
@include e(value) {
color: $-dark-color;
@include m(placeholder) {
color: $-dark-color-gray;
}
}
:deep(.wd-col-picker__arrow) {
color: $-dark-color;
}
@include e(list) {
color: $-dark-color;
}
@include e(selected) {
color: $-dark-color;
}
}
}
@include b(col-picker) {
@include when(border) {
.wd-col-picker__cell {
@include halfPixelBorder("top", $-cell-padding);
}
}
@include e(cell) {
position: relative;
display: flex;
align-items: flex-start;
padding: $-cell-wrapper-padding $-cell-padding;
overflow: hidden;
font-size: $-cell-title-fs;
line-height: $-cell-line-height;
color: $-cell-title-color;
text-decoration: none;
background-color: $-color-white;
}
@include e(cell) {
@include when(disabled) {
.wd-col-picker__value {
color: $-input-disabled-color;
}
}
@include when(align-right) {
.wd-col-picker__value {
text-align: right;
}
}
@include when(error) {
.wd-col-picker__value {
color: $-input-error-color;
}
:deep(.wd-col-picker__arrow) {
color: $-input-error-color;
}
}
@include when(large) {
font-size: $-cell-title-fs-large;
:deep(.wd-col-picker__arrow) {
font-size: $-cell-icon-size-large;
}
}
}
@include e(error-message) {
font-size: $-form-item-error-message-font-size;
line-height: $-form-item-error-message-line-height;
color: $-form-item-error-message-color;
text-align: left;
vertical-align: middle;
}
@include e(label) {
position: relative;
box-sizing: border-box;
width: $-input-cell-label-width;
margin-right: $-cell-padding;
color: $-cell-title-color;
@include when(required) {
padding-left: 12px;
&::after {
position: absolute;
top: 2px;
left: 0;
font-size: $-cell-required-size;
line-height: 1.1;
color: $-cell-required-color;
content: "*";
}
}
}
@include e(value-wraper) {
display: flex;
}
@include e(value) {
flex: 1;
margin-right: 10px;
color: $-cell-value-color;
@include when(ellipsis) {
@include lineEllipsis;
}
@include m(placeholder) {
color: $-input-placeholder-color;
}
}
@include e(body) {
flex: 1;
}
@include edeep(arrow) {
display: block;
font-size: $-cell-icon-size;
line-height: $-cell-line-height;
color: $-cell-arrow-color;
}
@include e(selected) {
height: $-col-picker-selected-height;
overflow: hidden;
font-size: $-col-picker-selected-fs;
color: $-col-picker-selected-color;
}
@include e(selected-container) {
position: relative;
display: flex;
user-select: none;
}
@include e(selected-item) {
flex: 0 0 auto;
height: $-col-picker-selected-height;
padding: $-col-picker-selected-padding;
line-height: $-col-picker-selected-height;
@include when(selected) {
font-weight: $-col-picker-selected-fw;
}
}
@include e(selected-line) {
position: absolute;
bottom: 5px;
left: 0;
z-index: 1;
width: $-col-picker-line-width;
height: $-col-picker-line-height;
background: $-col-picker-line-color;
border-radius: calc($-col-picker-line-height / 2);
box-shadow: $-col-picker-line-box-shadow;
}
@include e(list-container) {
position: relative;
}
@include e(list) {
box-sizing: border-box;
height: $-col-picker-list-height;
padding-bottom: $-col-picker-list-padding-bottom;
overflow: auto;
font-size: $-col-picker-list-fs;
color: $-col-picker-list-color;
-webkit-overflow-scrolling: touch;
}
@include e(list-item) {
display: flex;
align-items: flex-start;
padding: $-col-picker-list-item-padding;
@include when(selected) {
color: $-col-picker-list-color-checked;
:deep(.wd-col-picker__checked) {
opacity: 1;
}
}
@include when(disabled) {
color: $-col-picker-list-color-disabled;
}
}
@include e(list-item-label) {
line-height: 1.285;
}
@include e(list-item-tip) {
margin-top: 2px;
font-size: $-col-picker-list-fs-tip;
color: $-col-picker-list-color-tip;
}
@include edeep(checked) {
display: block;
margin-left: 4px;
font-size: $-col-picker-list-checked-icon-size;
color: $-col-picker-list-color-checked;
opacity: 0;
}
@include e(loading) {
position: absolute;
inset: 0;
display: flex;
align-items: center;
justify-content: center;
}
}
import type { ComponentPublicInstance, ExtractPropTypes, PropType } from "vue";
import {
baseProps,
makeArrayProp,
makeBooleanProp,
makeNumberProp,
makeRequiredProp,
makeStringProp
} from "wot-design-uni/components/common/props";
import type { FormItemRule } from "wot-design-uni/components/wd-form/types";
export const colPickerProps = {
...baseProps,
/**
* 选中项
*/
modelValue: makeRequiredProp(Array as PropType<Array<string | number>>),
/**
* 选择器数据,二维数组
*/
columns: makeArrayProp<Record<string, any>[]>(),
/**
* 选择器左侧文案
*/
label: String,
/**
* 设置左侧标题宽度
*/
labelWidth: makeStringProp("33%"),
/**
* 使用 label 插槽时设置该选项
*/
useLabelSlot: makeBooleanProp(false),
/**
* 使用默认插槽时设置该选项
*/
useDefaultSlot: makeBooleanProp(false),
/**
* 禁用
*/
disabled: makeBooleanProp(false),
/**
* 只读
*/
readonly: makeBooleanProp(false),
/**
* 选择器占位符
*/
placeholder: String,
/**
* 弹出层标题
*/
title: String,
/**
* 接收当前列的选中项 item、当前列下标、当前列选中项下标下一列数据处理函数 resolve、结束选择 finish
*/
columnChange: Function as PropType<ColPickerColumnChange>,
/**
* 自定义展示文案的格式化函数,返回一个字符串
*/
displayFormat: Function as PropType<ColPickerDisplayFormat>,
/**
* 确定前校验函数,接收 (value, resolve) 参数,通过 resolve 继续执行 picker,resolve 接收 1 个 boolean 参数
*/
beforeConfirm: Function as PropType<ColPickerBeforeConfirm>,
/**
* 选择器的值靠右展示
*/
alignRight: makeBooleanProp(false),
/**
* 是否为错误状态,错误状态时右侧内容为红色
*/
error: makeBooleanProp(false),
/**
* 是否必填
*/
required: makeBooleanProp(false),
/**
* 设置选择器大小,可选值:large
*/
size: String,
/**
* 选项对象中,value 对应的 key
*/
valueKey: makeStringProp("value"),
/**
* 选项对象中,展示的文本对应的 key
*/
labelKey: makeStringProp("label"),
/**
* 选项对象中,提示文案对应的 key
*/
tipKey: makeStringProp("tip"),
/**
* loading 图标的颜色
*/
loadingColor: makeStringProp("#4D80F0"),
/**
* 点击遮罩是否关闭
*/
closeOnClickModal: makeBooleanProp(true),
/**
* 自动触发 column-change 事件来补全数据,当 columns 为空数组或者 columns 数组长度小于 value 数组长度时,会自动触发 column-change
*/
autoComplete: makeBooleanProp(false),
/**
* 弹窗层级
*/
zIndex: makeNumberProp(15),
/**
* 弹出面板是否设置底部安全距离(iphone X 类型的机型)
*/
safeAreaInsetBottom: makeBooleanProp(true),
/**
* 是否超出隐藏
*/
ellipsis: makeBooleanProp(false),
/**
* 表单域 model 字段名,在使用表单校验功能的情况下,该属性是必填的
*/
prop: String,
/**
* 表单验证规则,结合wd-form组件使用
*/
rules: makeArrayProp<FormItemRule>(),
/**
* label 外部自定义样式
*/
customViewClass: makeStringProp(""),
/**
* value 外部自定义样式
*/
customLabelClass: makeStringProp(""),
customValueClass: makeStringProp("")
};
export type ColPickerProps = ExtractPropTypes<typeof colPickerProps>;
export type ColPickerColumnChangeOption = {
selectedItem: Record<string, any>;
index: number;
rowIndex: number;
resolve: (nextColumn: Record<string, any>[]) => void;
finish: (isOk?: boolean) => void;
};
export type ColPickerColumnChange = (option: ColPickerColumnChangeOption) => void;
export type ColPickerDisplayFormat = (selectedItems: Record<string, any>[]) => string;
export type ColPickerBeforeConfirm = (
value: (string | number)[],
selectedItems: Record<string, any>[],
resolve: (isPass: boolean) => void
) => void;
export type ColPickerExpose = {
// 关闭picker弹框
close: () => void;
// 打开picker弹框
open: () => void;
};
export type ColPickerInstance = ComponentPublicInstance<ColPickerExpose, ColPickerProps>;
This diff is collapsed.
@import "wot-design-uni/components/common/abstracts/variable";
@import "wot-design-uni/components/common/abstracts/mixin";
.wot-theme-dark {
@include b(col-picker) {
@include when(border) {
.wd-col-picker__cell {
@include halfPixelBorder("top", $-cell-padding, $-dark-border-color);
}
}
@include e(label) {
color: $-dark-color;
}
@include e(cell) {
color: $-dark-color;
background-color: $-dark-background2;
@include when(disabled) {
.wd-col-picker__value {
color: $-dark-color3;
}
}
}
@include e(list-item) {
@include when(disabled) {
color: $-dark-color3;
}
}
@include e(list-item-tip) {
color: $-dark-color-gray;
}
@include e(value) {
color: $-dark-color;
@include m(placeholder) {
color: $-dark-color-gray;
}
}
:deep(.wd-col-picker__arrow) {
color: $-dark-color;
}
@include e(list) {
color: $-dark-color;
}
@include e(selected) {
color: $-dark-color;
}
}
}
.tags {
gap: 32rpx;
padding: 0 32rpx;
div {
padding: 8rpx 16rpx;
font-size: 24rpx;
color: #4d80f0;
background-color: #4d80f01f;
}
}
@include b(col-picker) {
@include when(border) {
.wd-col-picker__cell {
@include halfPixelBorder("top", $-cell-padding);
}
}
@include e(cell) {
position: relative;
display: flex;
align-items: flex-start;
padding: $-cell-wrapper-padding $-cell-padding;
overflow: hidden;
font-size: $-cell-title-fs;
line-height: $-cell-line-height;
color: $-cell-title-color;
text-decoration: none;
background-color: $-color-white;
}
@include e(cell) {
@include when(disabled) {
.wd-col-picker__value {
color: $-input-disabled-color;
}
}
@include when(align-right) {
.wd-col-picker__value {
text-align: right;
}
}
@include when(error) {
.wd-col-picker__value {
color: $-input-error-color;
}
:deep(.wd-col-picker__arrow) {
color: $-input-error-color;
}
}
@include when(large) {
font-size: $-cell-title-fs-large;
:deep(.wd-col-picker__arrow) {
font-size: $-cell-icon-size-large;
}
}
}
@include e(error-message) {
font-size: $-form-item-error-message-font-size;
line-height: $-form-item-error-message-line-height;
color: $-form-item-error-message-color;
text-align: left;
vertical-align: middle;
}
@include e(label) {
position: relative;
box-sizing: border-box;
width: $-input-cell-label-width;
margin-right: $-cell-padding;
color: $-cell-title-color;
@include when(required) {
padding-left: 12px;
&::after {
position: absolute;
top: 2px;
left: 0;
font-size: $-cell-required-size;
line-height: 1.1;
color: $-cell-required-color;
content: "*";
}
}
}
@include e(value-wraper) {
display: flex;
}
@include e(value) {
flex: 1;
margin-right: 10px;
color: $-cell-value-color;
@include when(ellipsis) {
@include lineEllipsis;
}
@include m(placeholder) {
color: $-input-placeholder-color;
}
}
@include e(body) {
flex: 1;
}
@include edeep(arrow) {
display: block;
font-size: $-cell-icon-size;
line-height: $-cell-line-height;
color: $-cell-arrow-color;
}
@include e(selected) {
height: $-col-picker-selected-height;
overflow: hidden;
font-size: $-col-picker-selected-fs;
color: $-col-picker-selected-color;
}
@include e(selected-container) {
position: relative;
display: flex;
user-select: none;
}
@include e(selected-item) {
flex: 0 0 auto;
height: $-col-picker-selected-height;
padding: $-col-picker-selected-padding;
line-height: $-col-picker-selected-height;
@include when(selected) {
font-weight: $-col-picker-selected-fw;
}
}
@include e(selected-line) {
position: absolute;
bottom: 5px;
left: 0;
z-index: 1;
width: $-col-picker-line-width;
height: $-col-picker-line-height;
background: $-col-picker-line-color;
border-radius: calc($-col-picker-line-height / 2);
box-shadow: $-col-picker-line-box-shadow;
}
@include e(list-container) {
position: relative;
}
@include e(list) {
box-sizing: border-box;
height: $-col-picker-list-height;
padding-bottom: $-col-picker-list-padding-bottom;
overflow: auto;
font-size: $-col-picker-list-fs;
color: $-col-picker-list-color;
-webkit-overflow-scrolling: touch;
}
@include e(list-item) {
display: flex;
align-items: flex-start;
padding: $-col-picker-list-item-padding;
@include when(selected) {
color: $-col-picker-list-color-checked;
:deep(.wd-col-picker__checked) {
opacity: 1;
}
}
@include when(disabled) {
color: $-col-picker-list-color-disabled;
}
}
@include e(list-item-label) {
line-height: 1.285;
}
@include e(list-item-tip) {
margin-top: 2px;
font-size: $-col-picker-list-fs-tip;
color: $-col-picker-list-color-tip;
}
@include edeep(checked) {
display: block;
margin-left: 4px;
font-size: $-col-picker-list-checked-icon-size;
color: $-col-picker-list-color-checked;
opacity: 0;
}
@include e(loading) {
position: absolute;
inset: 0;
display: flex;
align-items: center;
justify-content: center;
}
}
import type { ComponentPublicInstance, ExtractPropTypes, PropType } from "vue";
import {
baseProps,
makeArrayProp,
makeBooleanProp,
makeNumberProp,
makeRequiredProp,
makeStringProp
} from "wot-design-uni/components/common/props";
import type { FormItemRule } from "wot-design-uni/components/wd-form/types";
export const colPickerProps = {
...baseProps,
/**
* 选中项
*/
modelValue: makeRequiredProp(Array as PropType<Array<string | number>>),
/* 多选数据 */
mValue: {
type: Array,
default: () => []
},
mMax: {
type: Number,
default: 1
},
/**
* 选择器数据,二维数组
*/
columns: makeArrayProp<Record<string, any>[]>(),
/**
* 选择器左侧文案
*/
label: String,
/**
* 设置左侧标题宽度
*/
labelWidth: makeStringProp("33%"),
/**
* 使用 label 插槽时设置该选项
*/
useLabelSlot: makeBooleanProp(false),
/**
* 使用默认插槽时设置该选项
*/
useDefaultSlot: makeBooleanProp(false),
/**
* 禁用
*/
disabled: makeBooleanProp(false),
/**
* 只读
*/
readonly: makeBooleanProp(false),
/**
* 选择器占位符
*/
placeholder: String,
/**
* 弹出层标题
*/
title: String,
/**
* 接收当前列的选中项 item、当前列下标、当前列选中项下标下一列数据处理函数 resolve、结束选择 finish
*/
columnChange: Function as PropType<ColPickerColumnChange>,
/**
* 自定义展示文案的格式化函数,返回一个字符串
*/
displayFormat: Function as PropType<ColPickerDisplayFormat>,
/**
* 确定前校验函数,接收 (value, resolve) 参数,通过 resolve 继续执行 picker,resolve 接收 1 个 boolean 参数
*/
beforeConfirm: Function as PropType<ColPickerBeforeConfirm>,
/**
* 选择器的值靠右展示
*/
alignRight: makeBooleanProp(false),
/**
* 是否为错误状态,错误状态时右侧内容为红色
*/
error: makeBooleanProp(false),
/**
* 是否必填
*/
required: makeBooleanProp(false),
/**
* 设置选择器大小,可选值:large
*/
size: String,
/**
* 选项对象中,value 对应的 key
*/
valueKey: makeStringProp("value"),
/**
* 选项对象中,展示的文本对应的 key
*/
labelKey: makeStringProp("label"),
/**
* 选项对象中,提示文案对应的 key
*/
tipKey: makeStringProp("tip"),
/**
* loading 图标的颜色
*/
loadingColor: makeStringProp("#4D80F0"),
/**
* 点击遮罩是否关闭
*/
closeOnClickModal: makeBooleanProp(true),
/**
* 自动触发 column-change 事件来补全数据,当 columns 为空数组或者 columns 数组长度小于 value 数组长度时,会自动触发 column-change
*/
autoComplete: makeBooleanProp(false),
/**
* 弹窗层级
*/
zIndex: makeNumberProp(15),
/**
* 弹出面板是否设置底部安全距离(iphone X 类型的机型)
*/
safeAreaInsetBottom: makeBooleanProp(true),
/**
* 是否超出隐藏
*/
ellipsis: makeBooleanProp(false),
/**
* 表单域 model 字段名,在使用表单校验功能的情况下,该属性是必填的
*/
prop: String,
/**
* 表单验证规则,结合wd-form组件使用
*/
rules: makeArrayProp<FormItemRule>(),
/**
* label 外部自定义样式
*/
customViewClass: makeStringProp(""),
/**
* value 外部自定义样式
*/
customLabelClass: makeStringProp(""),
customValueClass: makeStringProp("")
};
export type ColPickerProps = ExtractPropTypes<typeof colPickerProps>;
export type ColPickerColumnChangeOption = {
selectedItem: Record<string, any>;
index: number;
rowIndex: number;
addMValue: Function;
resolve: (nextColumn: Record<string, any>[]) => void;
finish: (isOk?: boolean) => void;
};
export type ColPickerColumnChange = (option: ColPickerColumnChangeOption) => void;
export type ColPickerDisplayFormat = (selectedItems: Record<string, any>[]) => string;
export type ColPickerBeforeConfirm = (
value: (string | number)[],
selectedItems: Record<string, any>[],
resolve: (isPass: boolean) => void
) => void;
export type ColPickerExpose = {
// 关闭picker弹框
close: () => void;
// 打开picker弹框
open: () => void;
};
export type ColPickerInstance = ComponentPublicInstance<ColPickerExpose, ColPickerProps>;
This diff is collapsed.
......@@ -43,7 +43,9 @@
/* ios打包配置 */
"ios" : {},
/* SDK配置 */
"sdkConfigs" : {}
"sdkConfigs" : {
"maps" : {}
}
}
},
/* 快应用特有相关 */
......@@ -65,8 +67,8 @@
"mp-toutiao" : {
"usingComponents" : true
},
"uniStatistics": {
"enable": false
"uniStatistics" : {
"enable" : false
},
"vueVersion" : "3",
"h5" : {
......@@ -78,6 +80,18 @@
"treeShaking" : {
"enable" : true
}
},
"sdkConfigs" : {
"maps" : {
"amap" : {
"key" : "06dbd82eab0908a62324622a319a80bb",
"securityJsCode" : "674986097d062e86d7aabc3fe75541e3",
"serviceHost" : ""
}
}
},
"unipush" : {
"enable" : false
}
}
}
......@@ -9,7 +9,8 @@
{
"path": "pages/postionList/index",
"style": {
"navigationBarTitleText": "职位"
"navigationBarTitleText": "职位",
"navigationStyle": "custom"
}
},
{
......@@ -36,6 +37,98 @@
"style": {
"navigationBarTitleText": "政策"
}
},
{
"path": "pages/articleDetails/index",
"style": {
"navigationBarTitleText": "文章详情"
}
},
{
"path": "pages/user/resume/index",
"style": {
"navigationBarTitleText": "我的简历"
}
},
{
"path": "pages/user/resume/essentialInformation/index",
"style": {
"navigationBarTitleText": "基本信息"
}
},
{
"path": "pages/user/resume/realNameAuthentication/index",
"style": {
"navigationBarTitleText": "实名认证"
}
},
{
"path": "pages/user/resume/introduce/index",
"style": {
"navigationBarTitleText": "个人优势"
}
},
{
"path": "pages/user/resume/jobIntention/index",
"style": {
"navigationBarTitleText": "求职意向"
}
},
{
"path": "pages/user/resume/workExperience/index",
"style": {
"navigationBarTitleText": "工作经历"
}
},
{
"path": "pages/user/resume/educationExperience/index",
"style": {
"navigationBarTitleText": "教育经历"
}
},
{
"path": "pages/postionList/demandRegistration/index",
"style": {
"navigationBarTitleText": "需求登记"
}
},
{
"path": "pages/postionList/platformList/index",
"style": {
"navigationBarTitleText": "第三方平台列表"
}
},
{
"path": "pages/postionList/companyDetails/index",
"style": {
"navigationBarTitleText": "公司简介",
"navigationBarBackgroundColor": "#1D2C3E",
"navigationBarTextStyle": "white"
}
},
{
"path": "pages/user/deliveryFeedback/index",
"style": {
"navigationBarTitleText": "投递反馈"
}
},
{
"path": "pages/user/myDelivery/index",
"style": {
"navigationBarTitleText": "我的投递"
}
},
{
"path": "pages/postionList/trap/index",
"style": {
"navigationBarTitleText": "求职陷阱"
}
},
{
"path": "pages/postionList/positionDetails/index",
"style": {
"navigationBarTitleText": "职位详情"
}
}
],
"tabBar": {
......
<template>
<div class="page">
<div class="top">
<video :src="evn.APP_IMAGE_BASE_API + data.videoPath" v-if="data.infoType === 2"></video>
<div class="title">{{ data.title }}</div>
<div class="flex-between">
<div class="publisher">{{ data.publisher }}</div>
<div class="date">{{ dayjs(data.publishDate).format("YYYY/MM/DD hh:mm") }}</div>
</div>
<div class="watch flex-align-center">
<img src="@/static/image/icon/eye.png" alt="" />
{{ data.views }}
</div>
</div>
<div class="content" v-html="data.content"></div>
</div>
</template>
<script setup>
import { getArticleDetailApi } from "@/api/article.js";
import evn from "@/utils/config.js";
import { ref } from "vue";
import dayjs from "dayjs";
const data = ref({});
onLoad(({ id }) => {
getArticleDetailApi(id).then(res => {
console.log(res);
data.value = res.data;
});
});
</script>
<style lang="scss" scoped>
.page {
padding: 32rpx;
.top {
padding-bottom: 32rpx;
margin-bottom: 32rpx;
border-bottom: 2rpx solid #f3f4f8;
video {
width: 100%;
}
.title {
font-size: 32rpx;
font-weight: 600;
line-height: 48rpx;
color: #1b2026;
}
.flex-between {
margin: 16rpx 0;
font-size: 24rpx;
font-weight: 500;
line-height: 28rpx;
color: #77818f;
letter-spacing: 0rpx;
}
.watch {
font-size: 24rpx;
font-weight: 500;
line-height: 28rpx;
color: #77818f;
img {
width: 25.34rpx;
height: 16rpx;
margin-right: 8rpx;
}
}
}
}
</style>
<template>
<div>
123
<div class="policy">
<div class="tab-name" :enable-flex="true" :scroll-x="true">
<view :class="{ item: 1, active: active == v.id }" v-for="v in typeList" :key="v.id" @click="changeType(v)">{{
v.name
}}</view>
</div>
<scroll-view :scroll-y="true" class="content" @scrolltolower="getData()">
<article-list :list="list"></article-list>
</scroll-view>
</div>
</template>
<script setup>
import articleList from "@/components/articleList/index.vue";
import { getArticleListApi, getArticleTypesApi } from "@/api/article.js";
import { reactive, ref } from "vue";
const active = ref("");
const typeList = ref([{ id: "", name: "全部" }]);
getArticleTypesApi(2).then(res => {
typeList.value.push(...res.data);
});
const changeType = type => {
active.value = type.id;
pageNo = 1;
list.splice(0, list.length);
flag = false;
getData();
};
/* 文章 */
// 判断是否还有数据
let pageNo = 1;
let flag = false;
const list = reactive([]);
const getData = () => {
if (flag) {
return;
}
getArticleListApi({
type: 2,
categoryId: active.value,
pageNo: pageNo++,
pageSize: 10
}).then(res => {
if (res.data.length < 10) {
flag = true;
}
list.push(...res.data);
});
};
changeType({ id: "" });
</script>
<style lang="scss" scoped>
</style>
\ No newline at end of file
.policy {
display: flex;
flex-direction: column;
height: 100%;
}
.tab-name {
display: flex;
width: 100%;
height: 80rpx;
overflow-x: auto;
white-space: nowrap;
.item {
padding: 22rpx 24rpx;
font-size: 28rpx;
&.active {
background-image: url("https://lygsh-image.wjzpgz.com/icon/arc.png");
background-repeat: no-repeat;
background-position: 50% 100%;
background-size: 35.64rpx 11.24rpx;
}
}
}
.content {
flex-grow: 1;
height: 200rpx;
}
</style>
<template>
<div>
123
</div>
<div class="message-list">
<scroll-view scroll-y="{{true}}">
<view class="system">
<view class="item flex-between" v-for="(v, i) in 8" :key="i">
<img src="@/static/image/user/default-avatar.png" alt="" />
<view class="content">
<view class="name-date flex-between">
<text class="name">预约提醒</text>
<text class="date">2024-06-21 12:30</text>
</view>
<view class="message flex-between">
<text>预约活动还有24小时开始</text>
<view class="flex-align-center">
<text class="link">立即前往</text>
<view class="arrow"></view>
</view>
</view>
</view>
</view>
</view>
</scroll-view>
</div>
</template>
<script setup>
uni.getSystemInfo({
success: function (res) {
console.log(res)
},
fail: function (err) {
console.log(err)
}
})
import { ref } from "vue";
const ossImgPrefix = "";
const res = ref({});
const getAddress = () => {
console.log("123");
uni.getLocation({
type: "wgs84",
success: function (res) {
res.value = res;
},
fail(err) {
console.log("errerrerr", err);
}
});
};
</script>
<style lang="scss" scoped>
div{
border: 1rpx solid red;
.message-list {
display: flex;
flex-direction: column;
height: 100%;
}
.tabs {
display: flex;
align-items: center;
justify-content: center;
padding-bottom: 14rpx;
background-color: #ffffff;
text {
width: 280rpx;
height: 80rpx;
font-size: 36rpx;
line-height: 80rpx;
color: #1b2026;
text-align: center;
&.active {
position: relative;
font-size: 36rpx;
font-weight: 600;
background-image: url("https://lygsh-image.wjzpgz.com/community/communityActiveTab.png");
background-repeat: no-repeat;
background-position: 50% 100%;
background-size: 20% 20%;
}
}
}
.container {
flex-grow: 1;
height: 1rpx;
background-color: #aa0f00;
}
scroll-view {
flex-grow: 1;
height: 200rpx;
background-color: #ffffff;
.feedback {
.item {
position: relative;
padding: 32rpx;
padding-left: 80rpx;
&:not(:first-child) {
border-top: 16rpx solid #f3f4f8;
}
&.new::after {
position: absolute;
top: 50%;
left: 32rpx;
display: block;
width: 24rpx;
height: 24rpx;
content: "";
background-color: #f05a25;
border-radius: 50%;
transform: translate(0, -50%);
}
.job-name {
.name {
font-size: 32rpx;
font-weight: 600;
line-height: 36rpx;
color: #1b2026;
}
.salary {
font-size: 36rpx;
font-weight: 500;
line-height: 24rpx;
color: #1f86ff;
text {
font-size: 28rpx;
font-weight: normal;
line-height: 24rpx;
color: #1f86ff;
}
}
}
.com-name {
margin-top: 16rpx;
font-size: 24rpx;
font-weight: normal;
line-height: 36rpx;
color: #77818f;
letter-spacing: 0rpx;
}
.hr {
margin-top: 18rpx;
font-size: 24rpx;
line-height: 36rpx;
color: #77818f;
.hr-name {
margin-right: 34rpx;
img {
width: 36rpx;
height: 36rpx;
border-radius: 50%;
}
}
}
.state {
position: absolute;
right: 28rpx;
bottom: 32rpx;
padding: 16rpx 32rpx;
font-size: 24rpx;
font-weight: 600;
line-height: 28rpx;
color: #f53f3f;
background: #ffece8;
}
}
}
.system {
.item {
padding: 32rpx;
border-bottom: 16rpx solid #f3f4f8;
img {
width: 86rpx;
height: 86rpx;
border-radius: 50%;
}
.content {
flex: 1;
margin-left: 24rpx;
.name-date {
.name {
font-size: 28rpx;
font-weight: 600;
line-height: 42rpx;
color: #1b2026;
text-align: center;
}
.date {
font-size: 24rpx;
font-weight: 500;
line-height: 36rpx;
color: #77818f;
}
}
.message {
margin-top: 14rpx;
font-size: 24rpx;
font-weight: normal;
line-height: 36rpx;
color: #1b2026;
.link {
font-size: 24rpx;
font-weight: 500;
line-height: 36rpx;
color: #1f86ff;
}
.arrow {
border-color: #1f86ff;
}
}
}
}
}
}
</style>
\ No newline at end of file
</style>
<template>
<div>
123
<div class="policy">
<div class="tab-name" :enable-flex="true" :scroll-x="true">
<view :class="{ item: 1, active: active == v.id }" v-for="v in typeList" :key="v.id" @click="changeType(v)">{{
v.name
}}</view>
</div>
<scroll-view :scroll-y="true" class="content" @scrolltolower="getData()">
<article-list :list="list"></article-list>
</scroll-view>
</div>
</template>
<script setup>
import articleList from "@/components/articleList/index.vue";
import { getArticleListApi, getArticleTypesApi } from "@/api/article.js";
import { reactive, ref } from "vue";
const active = ref("");
const typeList = ref([{ id: "", name: "全部" }]);
getArticleTypesApi(1).then(res => {
typeList.value.push(...res.data);
});
const changeType = type => {
active.value = type.id;
pageNo = 1;
list.splice(0, list.length);
flag = false;
getData();
};
/* 文章 */
// 判断是否还有数据
let pageNo = 1;
let flag = false;
const list = reactive([]);
const getData = () => {
if (flag) {
return;
}
getArticleListApi({
type: 1,
categoryId: active.value,
pageNo: pageNo++,
pageSize: 10
}).then(res => {
if (res.data.length < 10) {
flag = true;
}
list.push(...res.data);
});
};
changeType({ id: "" });
</script>
<style lang="scss" scoped>
</style>
\ No newline at end of file
.policy {
display: flex;
flex-direction: column;
height: 100%;
}
.tab-name {
display: flex;
width: 100%;
height: 80rpx;
overflow-x: auto;
white-space: nowrap;
.item {
padding: 22rpx 24rpx;
font-size: 28rpx;
&.active {
background-image: url("https://lygsh-image.wjzpgz.com/icon/arc.png");
background-repeat: no-repeat;
background-position: 50% 100%;
background-size: 35.64rpx 11.24rpx;
}
}
}
.content {
flex-grow: 1;
height: 200rpx;
}
</style>
This diff is collapsed.
<template>
<div class="page">
<scroll-view scroll-y="{{true}}" @scrolltolower="getData">
<view class="item" v-for="(item, index) in list" :key="item.id">
<view class="flex-between">
<text class="name">{{ item.needName }}</text>
<view v-if="item.userId" class="state disable">已提交</view>
<view v-else class="state" @tap="showPopup(item)">我需要</view>
</view>
<view class="content">
{{ item.needDesc }}
</view>
</view>
</scroll-view>
</div>
<wd-overlay :show="show" @click="show = false">
<view class="popout-wrap" @click.stop>
<view class="popout">
<image src="@/static/image/postion/demandRegistrationPopout.png" />
<view class="text1">需求登记</view>
<view class="text2">平台将自动获取您个人信息</view>
<view class="text2">用于后续平台联系您提供服务</view>
<view class="btn flex-between">
<view class="cancel" @tap="show = false">取消</view>
<view class="confirm" @tap="submit">立即提交</view>
</view>
</view>
</view>
</wd-overlay>
</template>
<script setup>
import { reactive, ref } from "vue";
import { getNeedListApi, needRegisterApi } from "@/api/postion";
const list = reactive([]);
let page = 1;
const getData = () => {
getNeedListApi({
pageSize: 10,
pageNo: page++
}).then(res => {
if (res.code == 200) {
// console.log(list);
list.push(...res.data);
}
});
};
const show = ref(false);
let tempItem = null;
const showPopup = item => {
tempItem = item;
show.value = true;
};
const submit = () => {
needRegisterApi(tempItem.needId).then(res => {
if (res.code == 200) {
tempItem.userId = true;
uni.showToast({
title: "申请成功",
icon: "success"
});
}
show.value = false;
});
};
getData();
</script>
<style lang="scss" scoped>
.page {
height: 100%;
scroll-view {
height: 100%;
}
}
.item {
padding: 16px;
color: #1b2026;
border-bottom: 8px solid #f3f4f8;
.name {
font-size: 16px;
font-weight: 600;
line-height: 21px;
}
.state {
padding: 4px 10px;
color: #ffffff;
background: #1f86ff;
border-radius: 6px;
}
.disable {
background: #d6ddeb;
}
.content {
margin-top: 7px;
font-size: 12px;
font-weight: normal;
line-height: 18px;
letter-spacing: 0;
}
}
.popout-wrap {
display: flex;
align-items: center;
justify-content: center;
height: 100%;
}
.popout {
display: flex;
flex-direction: column;
align-items: center;
width: 300px;
height: 248px;
background-color: #ffffff;
border-radius: 8px;
image {
width: 126px;
height: 96px;
margin-top: 16px;
}
view {
font-size: 14px;
font-weight: normal;
line-height: 20px;
color: #000000;
text-align: center;
letter-spacing: 0;
}
.text1 {
margin-bottom: 7px;
color: #1b2026;
}
.btn {
box-sizing: border-box;
width: 100%;
padding-right: 6px;
padding-left: 29px;
margin-top: 17px;
.cancel {
padding: 7px 16px;
font-size: 14px;
font-weight: 500;
line-height: 22px;
color: #1f86ff;
background: rgb(31 134 255 / 10%);
border-radius: 6px;
}
.confirm {
padding: 7px 53px;
line-height: 22px;
color: #ffffff;
text-align: center;
letter-spacing: 0;
background: #1f86ff;
border-radius: 6px;
}
}
}
</style>
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment