sale-client 3.7.21 → 3.7.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,720 +1,325 @@
1
1
  <template>
2
- <div class="value-add-info">
3
- <!-- 加载状态 -->
4
- <div v-if="loading" class="loading-state">
5
- <div class="spinner"></div>
6
- <p>正在获取增值信息...</p>
2
+ <div class="panel panel-info auto">
3
+ <div class="panel-heading auto" style="height: 30px">
4
+ <h4 style="display:inline-block;margin-top: auto">增值信息</h4>
7
5
  </div>
8
-
9
- <!-- 有数据状态 -->
10
- <div v-else-if="hasinfo == 1 && valuedate.length > 0" class="modern-card">
11
- <div class="card-header">
12
- <div class="header-content">
13
- <div class="title-section">
14
- <div class="icon-wrapper">
15
- <svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor">
16
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z" />
17
- </svg>
18
- </div>
19
- <div>
20
- <h3 class="card-title">增值信息服务</h3>
21
- <p class="card-subtitle">当前增值服务概况</p>
22
- </div>
23
- </div>
24
- <div class="count-badge">
25
- <span class="count-number">{{ valuedate.length }}</span>
26
- <span class="count-label">项服务</span>
27
- </div>
28
- </div>
29
- </div>
30
-
31
- <div class="card-body">
32
- <div class="table-container">
33
- <table class="modern-table">
34
- <thead>
35
- <tr>
36
- <th class="table-header product-column">
37
- <div class="header-content">
38
- <svg class="header-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor">
39
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M20 7l-8-4-8 4m16 0l-8 4m8-4v10l-8 4m0-10L4 7m8 4v10M4 7v10l8 4" />
40
- </svg>
41
- <span>产品名称</span>
42
- </div>
43
- </th>
44
- <th class="table-header date-column">
45
- <div class="header-content">
46
- <svg class="header-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor">
47
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" />
48
- </svg>
49
- <span>购买时间</span>
50
- </div>
51
- </th>
52
- <th class="table-header status-column">
53
- <div class="header-content">
54
- <svg class="header-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor">
55
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z" />
56
- </svg>
57
- <span>状态</span>
58
- </div>
59
- </th>
60
- </tr>
61
- </thead>
62
- <tbody>
63
- <tr v-for="(valadditem, index) in valuedate" :key="index" class="table-row">
64
- <td class="table-cell product-cell">
65
- <div class="product-info">
66
- <div class="product-icon-wrapper" :style="{ backgroundColor: getProductColor(index) }">
67
- <svg class="product-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor">
68
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 7h.01M7 3h5c.512 0 1.024.195 1.414.586l7 7a2 2 0 010 2.828l-7 7a2 2 0 01-2.828 0l-7-7A2 2 0 013 12V7a4 4 0 014-4z" />
69
- </svg>
70
- </div>
71
- <div class="product-details">
72
- <span class="product-name">{{ valadditem.value_type }}</span>
73
- <span v-if="valadditem.yearvalue && valadditem.yearvalue !== '无'" class="product-duration">
74
- {{ parseFloat(valadditem.yearvalue) > 0 ? `${valadditem.yearvalue}年` : '未开始' }}
75
- </span>
76
- </div>
77
- </div>
78
- </td>
79
- <td class="table-cell date-cell">
80
- <div class="date-display">
81
- <span class="date-text">{{ formatDate(valadditem.startDate) }}</span>
82
- <span v-if="valadditem.endDate" class="date-label">开始日期</span>
83
- </div>
84
- </td>
85
- <td class="table-cell status-cell">
86
- <div class="status-badge" :class="valadditem.isuse === '是' ? 'active' : 'inactive'">
87
- <span class="status-dot" :class="valadditem.isuse === '是' ? 'active' : 'inactive'"></span>
88
- <span class="status-text">{{ valadditem.isuse === '是' ? '已启用' : '未启用' }}</span>
89
- </div>
90
- </td>
91
- </tr>
92
- </tbody>
93
- </table>
94
- </div>
95
- </div>
96
-
97
- <div class="card-footer">
98
- <div class="footer-content">
99
- <div class="summary">
100
- <div class="summary-item">
101
- <span class="summary-label">已启用:</span>
102
- <span class="summary-value active-count">{{ getActiveCount }}</span>
103
- </div>
104
- <div class="summary-item">
105
- <span class="summary-label">未启用:</span>
106
- <span class="summary-value inactive-count">{{ getInactiveCount }}</span>
107
- </div>
108
- </div>
109
- <div class="update-info">
110
- <span class="update-text">最后更新: {{ getCurrentTime() }}</span>
111
- </div>
112
- </div>
6
+ <div class="auto info-content" v-if="hasinfo == 1 ">
7
+ <table class="table table-striped table-bordered" >
8
+ <thead>
9
+ <tr> <th colspan="3" style="text-align: center;background-color: #8cbce2;">增值信息概况</th></tr>
10
+ <tr>
11
+ <td colspan="1" class="headers" >
12
+ <span style="width:100%;height:90%;display: block;border-right: 1px solid #222;color:#222">产品</span>
13
+ </td>
14
+ <td colspan="1" class="headers">
15
+ <span style="width:100%;height:90%;display: block;border-right: 1px solid #222;color:#222">
16
+ 购买时间
17
+ </span>
18
+ </td>
19
+ <td colspan="1" class="headers2" >
20
+ <span style="width:100%;height:90%;display: block;color:#222">
21
+ 是否购买
22
+ </span>
23
+ </td>
24
+ </tr>
25
+ </thead>
26
+ <template v-for="valadditem in valuedate">
27
+
28
+ <tr style="background:#deecf9;border-bottom: 8px solid white;">
29
+ <td colspan="1" style="line-height:30px;text-align: left;padding-left:35px;border: #E9E9E9 solid 1px;border-left:2px solid #E4EEFA">
30
+ <span style="width:60%;height:90%;margin:0 auto;border-left:4px solid #5ac0d9;" >{{ valadditem.value_type }}</span>
31
+ </td>
32
+ <td colspan="1" class="staduadr" >{{ valadditem.startDate==''?'':valadditem.startDate.substring(0,10) }}</td>
33
+ <td colspan="1" class="staduadr" >
34
+ <span v-show="valadditem.isuse == '是'" class="checkboxk1" >
35
+ <span class="checkboxk2"></span>
36
+ </span>
37
+ <span v-show="valadditem.isuse == '否'" class="checkboxk1" >
38
+ <span class="checkboxk3"></span>
39
+ </span>
40
+ </td>
41
+ </tr>
42
+ </template>
43
+
44
+ </table>
45
+ </div>
46
+ <div class="auto info-content" v-if="hasinfo === -1 && allhasinfo==0">
47
+ <div class="row">
48
+ <p>正在获取增值信息...</p>
113
49
  </div>
114
50
  </div>
115
-
116
- <!-- 无数据状态 -->
117
- <div v-else-if="(hasinfo === 0 || (hasinfo === 1 && valuedate.length === 0)) && !loading" class="empty-state">
118
- <div class="empty-illustration">
119
- <svg class="empty-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor">
120
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.172 16.172a4 4 0 015.656 0M9 10h.01M15 10h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" />
121
- </svg>
51
+ <div class="auto info-content" v-if="hasinfo === 0 && allhasinfo==0">
52
+ <div class="row">
53
+ <strong>暂无增值信息</strong>
122
54
  </div>
123
- <h4 class="empty-title">暂无增值信息</h4>
124
- <p class="empty-description">当前用户没有购买任何增值服务</p>
125
55
  </div>
56
+ <modal v-if="showParame" :show.sync="showParame" v-ref:modal backdrop="false">
57
+ <header slot="modal-header" class="modal-header">
58
+ <h4 class="modal-title" style="text-align: center;">修改{{data.f_user_name}}[{{changeitem.name}}]增值业务</h4>
59
+ </header>
60
+ <article slot="modal-body" class="modal-body" style="height:65px;">
61
+ <form class="form-horizontal" >
62
+ <div class="form-group col-sm-6">
63
+ <label for="f_title" class="control-label">开始时间</label>
64
+ <datepicker :format="'yyyy-MM-dd'" :value.sync="changeitem.startdate"
65
+ class="datepicker"
66
+ placeholder="开始时间"
67
+ style="width:60%"
68
+ v-model="changeitem.startdate"
69
+ ></datepicker>
70
+ </div>
71
+ <div class="form-group col-sm-6">
72
+ <label for="f_reason" class="control-label">终止时间</label>
73
+ <datepicker :format="'yyyy-MM-dd'" :value.sync="changeitem.enddate"
74
+ class="datepicker"
75
+ placeholder="终止时间"
76
+ style="width:60%"
77
+ v-model="changeitem.enddate"
78
+ ></datepicker>
79
+ </div>
80
+ </form>
81
+ </article>
82
+
83
+ <footer slot="modal-footer" class="modal-footer">
84
+ <button type="button" class="btn btn-success" @click='updateConfirm'>确认</button>
85
+ <button type="button" class="btn btn-default" @click='updateclose'>取消</button>
86
+ </footer>
87
+ </modal>
126
88
  </div>
127
- </template>
128
-
129
- <script setup>
130
- import { ref, watch, onMounted, computed } from 'vue'
131
- import { runLogic } from '@vue2-client/services/api/common'
132
-
133
- // 接收父组件传递的userInfo
134
- const props = defineProps({
135
- userInfo: {
136
- type: Object,
137
- default: () => ({})
138
- }
139
- })
140
-
141
- const hasinfo = ref(-1) // -1: 未加载, 0: 无数据, 1: 有数据
142
- const valuedate = ref([])
143
- const loading = ref(false)
144
-
145
- // 计算属性
146
- const getActiveCount = computed(() => {
147
- return valuedate.value.filter(item => item.isuse === '是').length
148
- })
149
-
150
- const getInactiveCount = computed(() => {
151
- return valuedate.value.filter(item => item.isuse === '否').length
152
- })
153
-
154
- // 产品颜色数组
155
- const productColors = [
156
- 'rgba(24, 144, 255, 0.1)',
157
- 'rgba(24, 144, 255, 0.15)',
158
- 'rgba(24, 144, 255, 0.2)',
159
- 'rgba(24, 144, 255, 0.25)',
160
- 'rgba(24, 144, 255, 0.3)'
161
- ]
162
-
163
- // 获取产品颜色
164
- const getProductColor = (index) => {
165
- return productColors[index % productColors.length]
166
- }
167
-
168
- // 格式化日期
169
- const formatDate = (dateString) => {
170
- if (!dateString) return '未设置'
171
- return dateString.substring(0, 10)
172
- }
173
-
174
- // 获取当前时间
175
- const getCurrentTime = () => {
176
- const now = new Date()
177
- return `${now.getHours().toString().padStart(2, '0')}:${now.getMinutes().toString().padStart(2, '0')}`
178
- }
179
-
180
- // 获取增值信息的函数
181
- const getValueAddInfo = async () => {
182
- if (!props.userInfo || (!props.userInfo.f_userfiles_id && !props.userInfo.f_userinfo_id)) {
183
- hasinfo.value = 0
184
- return
185
- }
186
-
187
- loading.value = true
188
- try {
189
- const param = {
190
- f_userfiles_id: props.userInfo.f_userfiles_id,
191
- f_userinfo_id: props.userInfo.f_userinfo_id
192
- }
193
89
 
194
- if (props.userInfo.f_olduserinfo_code) {
195
- param.f_olduserinfo_code = props.userInfo.f_olduserinfo_code
90
+ </template>
91
+ <script>
92
+ import {HttpResetClass} from 'vue-client'
93
+
94
+ let getvalueaddinfo = async function(self){
95
+ try{
96
+ let http = new HttpResetClass()
97
+ let param = {
98
+ f_userfiles_id: self.data.f_userfiles_id,
99
+ f_userinfo_id: self.data.f_userinfo_id
196
100
  }
197
-
198
- const res = await runLogic('valueaddinfo', param, 'af-revenue')
199
- console.log('获取增值信息成功:', res)
200
- if (res && !(JSON.stringify(res) === '{}')) {
201
- hasinfo.value = 1
202
- valuedate.value = res.valaddinfo || []
203
-
204
- if (valuedate.value.length > 0) {
205
- valuedate.value.forEach(item => {
206
- item.yearvalue = getdiffTime(item.startDate, item.endDate, 'year')
207
- })
208
- } else {
209
- hasinfo.value = 0
101
+ if (self.data.f_olduserinfo_code) {
102
+ param.f_olduserinfo_code = self.data.f_olduserinfo_code
103
+ }
104
+ let valueaddinfo = await http.load('POST', 'rs/logic/valueaddinfo', param, {resolveMsg: null, rejectMsg: null})
105
+ if(valueaddinfo.data){
106
+ self.hasinfo = 1;
107
+ self.valuedate= valueaddinfo.data.valaddinfo;
108
+ if(self.valuedate.length>0){
109
+ self.valuedate.forEach(item=>{
110
+ item.yearvalue = self.getdiffTime(item.startDate,item.endDate,'year');
111
+ })
112
+ }else{
113
+ self.hasinfo = 0
114
+ }
115
+
116
+ }else{
117
+ self.hasinfo = 0
210
118
  }
211
- } else {
212
- hasinfo.value = 0
119
+ }catch(e){
120
+ self.hasinfo = 0;
121
+ // self.$showAlert("获取增值信息失败",'warning',2000);
213
122
  }
214
- } catch (error) {
215
- console.error('获取增值信息失败:', error)
216
- hasinfo.value = 0
217
- } finally {
218
- loading.value = false
219
- }
220
- }
221
-
222
- // 获取增值服务年限
223
- const getdiffTime = (d1, d2, models) => {
224
- if (d1 == null || d1 === '' || d2 == null || d2 === '' || d1.indexOf('-') < 0 || d2.indexOf('-') < 0) {
225
- return '无'
226
- }
227
- d1 = d1.split(' ')[0]
228
- d2 = d2.split(' ')[0]
229
- let day = 24 * 60 * 60 * 1000
230
- if (models == 'year') {
231
- day = day * 365
232
123
  }
233
- try {
234
- const dateArr = d1.split('-')
235
- const checkDate = new Date()
236
- checkDate.setFullYear(dateArr[0], dateArr[1] - 1, dateArr[2])
237
- const checkTime = checkDate.getTime()
238
124
 
239
- const dateArr2 = d2.split('-')
240
- const checkDate2 = new Date()
241
- checkDate2.setFullYear(dateArr2[0], dateArr2[1] - 1, dateArr2[2])
242
- const checkTime2 = checkDate2.getTime()
243
125
 
244
- const cha = ((checkTime2 - checkTime) / day).toFixed(2)
245
- return cha
246
- } catch (e) {
247
- return 0
126
+ export default{
127
+ title:'增值信息',
128
+ data(){
129
+ return {
130
+ model:{},
131
+ hasinfo:-1,
132
+ allhasinfo:0,
133
+ showParame:false,
134
+ oldchangeitem:{},
135
+ changeitem:{},
136
+ valuedate:[],
137
+ }
138
+ },
139
+ props: ['data'],
140
+ ready(){
141
+ if(this.data && this.data.f_userinfo_id!=null){
142
+ getvalueaddinfo(this)
143
+ }else{
144
+ this.hasinfo = 0;
145
+ }
146
+ },
147
+ methods:{
148
+ reflush(){
149
+ if(this.data.f_userinfo_id!=null){
150
+ getvalueaddinfo(this)
151
+ }else{
152
+ this.hasinfo = 0;
153
+ }
154
+ },
155
+ changevalueadd(valueadditem){
156
+ if(valueadditem.ishas =='1' && this.data.f_userinfo_id!=null && this.data.f_userinfo_id!='' ){
157
+ this.showParame = true;
158
+ let olditem = JSON.stringify(valueadditem);
159
+ this.changeitem = JSON.parse(olditem);
160
+ this.oldchangeitem = JSON.parse(olditem);
161
+ }
162
+ },
163
+ updateConfirm(){
164
+ if(this.changeitem.startdate> this.changeitem.enddate){
165
+ this.$showAlert("结束时间不能小于开始时间",'warning',2000);
166
+ return;
167
+ }else{
168
+ const param = {
169
+ oldvalueitem:this.oldchangeitem,
170
+ valueitem:this.changeitem,
171
+ userinfo:this.data,
172
+ f_operator: this.$login.f.name,
173
+ f_operatorid: this.$login.f.id,
174
+ f_orgid: this.$login.f.orgid,
175
+ f_orgname: this.$login.f.orgs,
176
+ f_depid: this.$login.f.depids,
177
+ f_depname: this.$login.f.deps,
178
+ }
179
+ this.$resetpost('rs/logic/valueaddsave',{data:param}, {resolveMsg: null, rejectMsg: null}).then((res)=>{
180
+ if(res.data){
181
+ if(res.data.code==200){
182
+ this.$showAlert('更新成功!','success',2000);
183
+ this.updateclose();
184
+ getvalueaddinfo(this);
185
+ }else{
186
+ this.$showAlert('更新失败!','warning',2000);
187
+ this.updateclose();
188
+ }
189
+ }
190
+ })
191
+ }
192
+
193
+ },
194
+ updateclose(){
195
+ this.changeitem = {};
196
+ this.oldchangeitem = {};
197
+ this.showParame = false;
198
+ },
199
+ //获取增值服务年限
200
+ getdiffTime(d1,d2,models) {
201
+ if(d1 == null || d1 == "" || d2 == null || d2 == "" || d1.indexOf("-")<0 || d2.indexOf("-")<0 ){
202
+ return "无";
203
+ }
204
+ d1 = d1.split(" ")[0];
205
+ d2 = d2.split(" ")[0];
206
+ let day = 24 * 60 * 60 * 1000;
207
+ if(models == 'year'){
208
+ day = day*365;
209
+ }
210
+ try {
211
+ let dateArr = d1.split("-");
212
+ let checkDate = new Date();
213
+ checkDate.setFullYear(dateArr[0], dateArr[1] - 1, dateArr[2]);
214
+ let checkTime = checkDate.getTime();
215
+
216
+ let dateArr2 = d2.split("-");
217
+ let checkDate2 = new Date();
218
+ checkDate2.setFullYear(dateArr2[0], dateArr2[1] - 1, dateArr2[2]);
219
+ let checkTime2 = checkDate2.getTime();
220
+
221
+ let cha = (( checkTime2-checkTime) / day).toFixed(2);
222
+ return cha;
223
+ } catch (e) {
224
+ return 0;
225
+ }
226
+ }
227
+ },
228
+ watch:{
229
+ 'data' () {
230
+ if(this.data == null){
231
+ this.hasinfo = 0;
232
+ this.allhasinfo = 0;
233
+ this.model = {};
234
+ }else{
235
+ getvalueaddinfo(this)
236
+ }
237
+ }
238
+ }
248
239
  }
249
- }
250
240
 
251
- // 监听userInfo变化,重新获取增值信息
252
- watch(() => props.userInfo, () => {
253
- getValueAddInfo()
254
- }, { deep: true })
255
241
 
256
- // 组件挂载时获取一次增值信息
257
- onMounted(() => {
258
- getValueAddInfo()
259
- })
260
242
  </script>
261
-
262
243
  <style scoped>
263
- .value-add-info {
264
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
265
- }
266
-
267
- /* 现代化卡片样式 */
268
- .modern-card {
269
- background: white;
270
- border-radius: 12px;
271
- box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
272
- overflow: hidden;
273
- transition: transform 0.3s ease, box-shadow 0.3s ease;
274
- }
275
-
276
- .modern-card:hover {
277
- transform: translateY(-2px);
278
- box-shadow: 0 8px 30px rgba(0, 0, 0, 0.12);
279
- }
280
-
281
- /* 卡片头部 */
282
- .card-header {
283
- padding: 20px 24px;
284
- background: linear-gradient(135deg, #1890ff 0%, #096dd9 100%);
285
- color: white;
286
- }
287
-
288
- .header-content {
289
- display: flex;
290
- justify-content: space-between;
291
- align-items: center;
292
- }
293
-
294
- .title-section {
295
- display: flex;
296
- align-items: center;
297
- gap: 12px;
298
- }
299
-
300
- .icon-wrapper {
301
- width: 48px;
302
- height: 48px;
303
- background: rgba(255, 255, 255, 0.2);
304
- border-radius: 12px;
305
- display: flex;
306
- align-items: center;
307
- justify-content: center;
308
- backdrop-filter: blur(10px);
309
- }
310
-
311
- .icon {
312
- width: 24px;
313
- height: 24px;
314
- stroke-width: 1.5;
315
- }
316
-
317
- .card-title {
318
- margin: 0;
319
- font-size: 20px;
320
- font-weight: 600;
321
- line-height: 1.2;
322
- }
323
-
324
- .card-subtitle {
325
- margin: 4px 0 0 0;
326
- font-size: 13px;
327
- opacity: 0.9;
328
- font-weight: 400;
329
- }
330
-
331
- .count-badge {
332
- background: rgba(255, 255, 255, 0.2);
333
- border-radius: 20px;
334
- padding: 6px 16px;
335
- backdrop-filter: blur(10px);
336
- display: flex;
337
- align-items: center;
338
- gap: 4px;
339
- }
340
-
341
- .count-number {
342
- font-size: 20px;
343
- font-weight: 700;
344
- }
345
-
346
- .count-label {
347
- font-size: 13px;
348
- opacity: 0.9;
349
- }
350
-
351
- /* 卡片主体 */
352
- .card-body {
353
- padding: 0;
354
- }
355
-
356
- .table-container {
357
- overflow-x: auto;
358
- padding: 0 4px;
359
- }
360
-
361
- .modern-table {
362
- width: 100%;
363
- border-collapse: separate;
364
- border-spacing: 0;
365
- }
366
-
367
- .table-header {
368
- padding: 16px 20px;
369
- text-align: left;
370
- font-size: 12px;
371
- font-weight: 600;
372
- text-transform: uppercase;
373
- letter-spacing: 0.5px;
374
- color: #666;
375
- background: #fafafa;
376
- border-bottom: 2px solid #f0f0f0;
377
- white-space: nowrap;
378
- }
379
-
380
- .table-header.product-column {
381
- width: 40%;
382
- border-left: 4px solid #1890ff;
383
- }
384
-
385
- .table-header.date-column {
386
- width: 30%;
387
- }
388
-
389
- .table-header.status-column {
390
- width: 30%;
391
- }
392
-
393
- .header-content {
394
- display: flex;
395
- align-items: center;
396
- gap: 8px;
397
- }
398
-
399
- .header-icon {
400
- width: 16px;
401
- height: 16px;
402
- stroke-width: 2;
403
- color: #1890ff;
404
- }
405
-
406
- /* 表格行样式 */
407
- .table-row {
408
- transition: all 0.2s ease;
409
- border-bottom: 1px solid #f5f5f5;
410
- }
411
-
412
- .table-row:hover {
413
- background: rgba(24, 144, 255, 0.02);
414
- transform: translateX(4px);
415
- }
416
-
417
- .table-cell {
418
- padding: 20px;
419
- vertical-align: middle;
420
- }
421
-
422
- .product-cell {
423
- border-left: 4px solid transparent;
424
- transition: border-color 0.3s ease;
425
- }
426
-
427
- .table-row:hover .product-cell {
428
- border-left-color: #1890ff;
429
- }
430
-
431
- .product-info {
432
- display: flex;
433
- align-items: center;
434
- gap: 12px;
435
- }
436
-
437
- .product-icon-wrapper {
438
- width: 40px;
439
- height: 40px;
440
- border-radius: 10px;
441
- display: flex;
442
- align-items: center;
443
- justify-content: center;
444
- flex-shrink: 0;
445
- }
446
-
447
- .product-icon {
448
- width: 20px;
449
- height: 20px;
450
- stroke-width: 1.5;
451
- color: #1890ff;
452
- }
453
-
454
- .product-details {
455
- display: flex;
456
- flex-direction: column;
457
- gap: 4px;
458
- }
459
-
460
- .product-name {
461
- font-size: 14px;
462
- font-weight: 500;
463
- color: #1f1f1f;
464
- }
465
-
466
- .product-duration {
467
- font-size: 12px;
468
- color: #666;
469
- background: #f5f5f5;
470
- padding: 2px 8px;
471
- border-radius: 10px;
472
- display: inline-block;
473
- width: fit-content;
474
- }
475
-
476
- .date-cell {
477
- font-family: 'SF Mono', Monaco, Consolas, 'Courier New', monospace;
478
- }
479
-
480
- .date-display {
481
- display: flex;
482
- flex-direction: column;
483
- gap: 4px;
484
- }
485
-
486
- .date-text {
487
- font-size: 14px;
488
- font-weight: 500;
489
- color: #1f1f1f;
490
- }
491
-
492
- .date-label {
493
- font-size: 12px;
494
- color: #999;
495
- text-transform: uppercase;
496
- letter-spacing: 0.5px;
497
- }
498
-
499
- .status-cell {
500
- padding-right: 20px;
501
- }
502
-
503
- .status-badge {
504
- display: inline-flex;
505
- align-items: center;
506
- gap: 8px;
507
- padding: 6px 12px;
508
- border-radius: 20px;
509
- font-size: 12px;
510
- font-weight: 500;
511
- transition: all 0.3s ease;
512
- }
513
-
514
- .status-badge.active {
515
- background: rgba(82, 196, 26, 0.1);
516
- color: #52c41a;
517
- }
518
-
519
- .status-badge.inactive {
520
- background: rgba(217, 217, 217, 0.1);
521
- color: #999;
522
- }
523
-
524
- .status-dot {
525
- width: 8px;
526
- height: 8px;
527
- border-radius: 50%;
528
- transition: all 0.3s ease;
529
- }
530
-
531
- .status-dot.active {
532
- background: #52c41a;
533
- box-shadow: 0 0 0 4px rgba(82, 196, 26, 0.2);
534
- }
535
-
536
- .status-dot.inactive {
537
- background: #d9d9d9;
538
- box-shadow: 0 0 0 4px rgba(217, 217, 217, 0.2);
539
- }
540
-
541
- /* 卡片底部 */
542
- .card-footer {
543
- padding: 16px 24px;
544
- background: #fafafa;
545
- border-top: 1px solid #f0f0f0;
546
- }
547
-
548
- .footer-content {
549
- display: flex;
550
- justify-content: space-between;
551
- align-items: center;
552
- }
553
-
554
- .summary {
555
- display: flex;
556
- gap: 20px;
557
- }
558
-
559
- .summary-item {
560
- display: flex;
561
- align-items: center;
562
- gap: 6px;
563
- font-size: 13px;
564
- }
565
-
566
- .summary-label {
567
- color: #666;
568
- }
569
-
570
- .summary-value {
571
- font-weight: 600;
572
- font-size: 16px;
573
- }
574
-
575
- .active-count {
576
- color: #52c41a;
577
- }
578
-
579
- .inactive-count {
580
- color: #999;
581
- }
582
-
583
- .update-info {
584
- font-size: 12px;
585
- color: #999;
586
- }
587
-
588
- /* 加载状态 */
589
- .loading-state {
590
- display: flex;
591
- flex-direction: column;
592
- align-items: center;
593
- justify-content: center;
594
- padding: 60px 20px;
595
- background: white;
596
- border-radius: 12px;
597
- box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
598
- animation: fadeIn 0.5s ease;
599
- }
600
-
601
- .spinner {
602
- width: 40px;
603
- height: 40px;
604
- border: 3px solid #f0f0f0;
605
- border-top: 3px solid #1890ff;
606
- border-radius: 50%;
607
- animation: spin 1s linear infinite;
608
- margin-bottom: 16px;
609
- }
610
-
611
- @keyframes spin {
612
- 0% { transform: rotate(0deg); }
613
- 100% { transform: rotate(360deg); }
614
- }
615
-
616
- /* 空状态 */
617
- .empty-state {
618
- text-align: center;
619
- padding: 60px 20px;
620
- background: white;
621
- border-radius: 12px;
622
- box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
623
- animation: fadeIn 0.5s ease;
624
- }
625
-
626
- .empty-illustration {
627
- width: 80px;
628
- height: 80px;
629
- margin: 0 auto 20px;
630
- color: #f0f0f0;
631
- }
632
-
633
- .empty-icon {
634
- width: 100%;
635
- height: 100%;
636
- stroke-width: 1;
637
- }
244
+ .img {
245
+ border: 1px solid #9773ed;
246
+ width: auto;
247
+ height: auto;
248
+ float: left;
249
+ text-align: center;
250
+ margin: 6px;
251
+ }
638
252
 
639
- .empty-title {
640
- margin: 0 0 8px 0;
641
- font-size: 18px;
642
- font-weight: 600;
643
- color: #1f1f1f;
644
- }
253
+ img {
254
+ margin: 6px;
255
+ }
645
256
 
646
- .empty-description {
647
- margin: 0;
648
- font-size: 14px;
649
- color: #666;
650
- max-width: 300px;
651
- margin: 0 auto;
652
- line-height: 1.5;
653
- }
654
257
 
655
- /* 响应式调整 */
656
- @media (max-width: 768px) {
657
- .card-header {
658
- padding: 16px 20px;
659
- }
660
-
661
- .table-header,
662
- .table-cell {
663
- padding: 12px 16px;
258
+ .container{
259
+ margin: 10px auto;
260
+ width: 80%;
261
+ height: auto;
664
262
  }
665
-
666
- .footer-content {
667
- flex-direction: column;
668
- gap: 12px;
669
- align-items: flex-start;
263
+ div::-webkit-scrollbar {
264
+ width: 0 !important;
265
+ height: 0 !important;
670
266
  }
671
-
672
- .product-name {
673
- font-size: 13px;
267
+
268
+ div{
269
+ -ms-overflow-style: none;
270
+ overflow: -moz-scrollbars-none;
674
271
  }
675
-
676
- .date-text {
677
- font-size: 13px;
272
+ .divmask {
273
+ pointer-events: none;
678
274
  }
679
-
680
- .card-title {
681
- font-size: 18px;
275
+ .app-header {
276
+ border-radius: 50%;
277
+ background: rgba(73, 158, 223, 0.4);
278
+ color: #FFF;
279
+ padding: 20px;
280
+ text-align: center;
281
+ font-size: 1.2em;
282
+ z-index: 10;
283
+ opacity:0.5;
284
+ bottom: 50px;
285
+ margin-top: -20px;
286
+ position: absolute;
287
+ top: 10%;
288
+ right: 2%;
289
+ height: 8%;
682
290
  }
683
- }
291
+ .headers{
292
+ text-align: center;
293
+ background-color: white;
294
+ color: #333;
295
+ font-weight: 100;
296
+ width: 33%;
684
297
 
685
- @media (max-width: 480px) {
686
- .title-section {
687
- flex-direction: column;
688
- align-items: flex-start;
689
- gap: 8px;
298
+ height: 15px;
299
+ font-size: 14px;
690
300
  }
691
-
692
- .icon-wrapper {
693
- width: 40px;
694
- height: 40px;
301
+ .headers2{
302
+ text-align: center;
303
+ background-color: white;
304
+ color: #333;
305
+ font-weight: 100;
306
+ width: 33%;
307
+ height: 15px;
308
+ font-size: 14px;
695
309
  }
696
-
697
- .product-info {
698
- flex-direction: column;
699
- align-items: flex-start;
700
- gap: 8px;
310
+ .staduadr{
311
+ line-height:30px;text-align: center;border: #E9E9E9 solid 1px;
701
312
  }
702
-
703
- .status-badge {
704
- flex-direction: column;
705
- gap: 4px;
706
- text-align: center;
313
+ .checkboxk1{
314
+ width: 50px;height: 22px;position: relative;border-radius: 20px;display: block;margin: 0 auto;
707
315
  }
708
- }
709
-
710
- @keyframes fadeIn {
711
- from {
712
- opacity: 0;
713
- transform: translateY(10px);
316
+ .checkboxk2{
317
+ width: 24px;height: 24px;position: absolute;top: 0px;left: 15px;border-radius: 17px;display: block;
318
+ background-image:url("../../../../../static/valueinfo1.png");
319
+ background-size: 100%;
714
320
  }
715
- to {
716
- opacity: 1;
717
- transform: translateY(0);
321
+ .checkboxk3{
322
+ width: 24px;height: 24px;position: absolute;top: 0px;left: 15px;border-radius: 17px;display: block;
323
+ background-image:url("../../../../../static/valueinfo0.png");background-size: 100%;
718
324
  }
719
- }
720
- </style>
325
+ </style>