jmash-core-mp 0.1.21 → 0.1.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.
Files changed (150) hide show
  1. package/.editorconfig +9 -9
  2. package/README.md +60 -60
  3. package/babel.config.json +34 -34
  4. package/eslint.config.mjs +7 -7
  5. package/lib/api/auth/index.d.ts +21 -21
  6. package/lib/api/auth/index.js +199 -199
  7. package/lib/api/auth/types.d.ts +86 -86
  8. package/lib/api/auth/types.js +9 -9
  9. package/lib/api/cms/index.d.ts +20 -20
  10. package/lib/api/cms/index.js +161 -161
  11. package/lib/api/cms/types.d.ts +200 -200
  12. package/lib/api/cms/types.js +1 -1
  13. package/lib/api/constant.d.ts +5 -5
  14. package/lib/api/constant.js +6 -6
  15. package/lib/api/dict/index.d.ts +18 -18
  16. package/lib/api/dict/index.js +34 -34
  17. package/lib/api/dict/types.d.ts +28 -28
  18. package/lib/api/dict/types.js +1 -1
  19. package/lib/api/dicts.d.ts +18 -18
  20. package/lib/api/dicts.js +67 -67
  21. package/lib/api/files/index.d.ts +25 -25
  22. package/lib/api/files/index.js +135 -135
  23. package/lib/api/files/types.d.ts +38 -38
  24. package/lib/api/files/types.js +1 -1
  25. package/lib/api/index.d.ts +4 -4
  26. package/lib/api/index.js +6 -6
  27. package/lib/api/myorgan/types.d.ts +22 -22
  28. package/lib/api/myorgan/types.js +1 -1
  29. package/lib/api/region/index.d.ts +7 -7
  30. package/lib/api/region/index.js +19 -19
  31. package/lib/api/region/types.d.ts +19 -19
  32. package/lib/api/region/types.js +1 -1
  33. package/lib/api/storage/index.d.ts +10 -10
  34. package/lib/api/storage/index.js +43 -43
  35. package/lib/api/storage/types.d.ts +28 -28
  36. package/lib/api/storage/types.js +1 -1
  37. package/lib/api/types.d.ts +42 -42
  38. package/lib/api/types.js +1 -1
  39. package/lib/app.mpx.d.ts +1 -1
  40. package/lib/components/auth-user/jmash-update-user.mpx.d.ts +1 -1
  41. package/lib/components/auth-user/jmash-user.mpx.d.ts +1 -1
  42. package/lib/components/cms/jmash-cms-acticle-list.mpx.d.ts +1 -1
  43. package/lib/components/cms/jmash-cms-article-item.mpx.d.ts +1 -1
  44. package/lib/components/cms/jmash-cms-article-view.mpx.d.ts +1 -0
  45. package/lib/components/cms/jmash-cms-article.mpx.d.ts +1 -1
  46. package/lib/components/cms/jmash-cms-like.mpx.d.ts +1 -1
  47. package/lib/components/common/jmash-upload-picture.mpx.d.ts +1 -0
  48. package/lib/components/core/jmash-login.mpx.d.ts +1 -0
  49. package/lib/index.d.ts +21 -21
  50. package/lib/index.js +14 -14
  51. package/lib/packages/pages/cms/cms-article-list.mpx.d.ts +1 -1
  52. package/lib/pages/index.mpx.d.ts +1 -0
  53. package/lib/store/user.d.ts +31 -31
  54. package/lib/store/user.js +227 -227
  55. package/lib/utils/common.d.ts +35 -35
  56. package/lib/utils/common.js +166 -166
  57. package/lib/utils/config.d.ts +5 -5
  58. package/lib/utils/config.js +29 -29
  59. package/lib/utils/db.d.ts +21 -21
  60. package/lib/utils/db.js +84 -84
  61. package/lib/utils/grpc.d.ts +5 -5
  62. package/lib/utils/grpc.js +20 -20
  63. package/lib/utils/net.d.ts +7 -7
  64. package/lib/utils/net.js +15 -15
  65. package/lib/utils/request.d.ts +2 -2
  66. package/lib/utils/request.js +123 -123
  67. package/mpx.config.js +27 -27
  68. package/package.json +1 -1
  69. package/postcss.config.js +11 -11
  70. package/project.config.json +24 -24
  71. package/project.private.config.json +13 -13
  72. package/public/index.html +15 -15
  73. package/src/api/auth/index.ts +227 -227
  74. package/src/api/auth/types.ts +166 -166
  75. package/src/api/cms/index.ts +218 -218
  76. package/src/api/cms/types.ts +379 -379
  77. package/src/api/constant.ts +6 -6
  78. package/src/api/dict/index.ts +44 -44
  79. package/src/api/dict/types.ts +49 -49
  80. package/src/api/dicts.ts +72 -72
  81. package/src/api/files/index.ts +163 -163
  82. package/src/api/files/types.ts +67 -67
  83. package/src/api/index.ts +11 -11
  84. package/src/api/myorgan/types.ts +42 -42
  85. package/src/api/region/index.ts +23 -23
  86. package/src/api/region/types.ts +36 -36
  87. package/src/api/storage/index.ts +62 -62
  88. package/src/api/storage/types.ts +54 -54
  89. package/src/api/types.ts +72 -72
  90. package/src/app.mpx +71 -71
  91. package/src/components/auth-user/jmash-logout.mpx +91 -91
  92. package/src/components/auth-user/jmash-update-user.mpx +386 -386
  93. package/src/components/auth-user/jmash-update-user.web.mpx +366 -366
  94. package/src/components/auth-user/jmash-user.mpx +359 -359
  95. package/src/components/cms/jmash-cms-acticle-list.mpx +182 -182
  96. package/src/components/cms/jmash-cms-article-item.mpx +241 -241
  97. package/src/components/cms/jmash-cms-article-view.mpx +131 -131
  98. package/src/components/cms/jmash-cms-article.mpx +68 -68
  99. package/src/components/cms/jmash-cms-like.mpx +151 -151
  100. package/src/components/common/jmash-avatar-edit.mpx +153 -153
  101. package/src/components/common/jmash-cascader-region.mpx +112 -112
  102. package/src/components/common/jmash-menu.mpx +129 -129
  103. package/src/components/common/jmash-none-data.mpx +82 -82
  104. package/src/components/common/jmash-pic-swiper.mpx +71 -71
  105. package/src/components/common/jmash-popup.mpx +137 -137
  106. package/src/components/common/jmash-search.mpx +126 -126
  107. package/src/components/common/jmash-single-btn.mpx +53 -53
  108. package/src/components/common/jmash-stepper.mpx +214 -214
  109. package/src/components/common/jmash-tab-bar.mpx +50 -50
  110. package/src/components/common/jmash-textarea.mpx +88 -88
  111. package/src/components/common/jmash-top-navigation.mpx +203 -203
  112. package/src/components/common/jmash-upload-picture.mpx +129 -126
  113. package/src/components/core/jmash-cms-protocol.mpx +66 -66
  114. package/src/components/core/jmash-login.ali.mpx +284 -284
  115. package/src/components/core/jmash-login.mpx +348 -348
  116. package/src/components/core/jmash-login.web.mpx +421 -421
  117. package/src/components/core/jmash-popup-login.ali.mpx +311 -311
  118. package/src/components/core/jmash-popup-login.mpx +415 -415
  119. package/src/components/core/jmash-popup-login.web.mpx +389 -389
  120. package/src/custom-tab-bar/index.mpx +10 -10
  121. package/src/global.d.ts +11 -11
  122. package/src/index.ts +71 -71
  123. package/src/packages/index.mpx +10 -10
  124. package/src/packages/pages/auth/cms-protocol.mpx +31 -31
  125. package/src/packages/pages/auth/login.mpx +59 -59
  126. package/src/packages/pages/auth/update-user.mpx +17 -17
  127. package/src/packages/pages/cms/cms-article-list.mpx +164 -164
  128. package/src/packages/pages/cms/cms-article.mpx +32 -32
  129. package/src/pages/basic-component.mpx +30 -30
  130. package/src/pages/half-home.mpx +58 -58
  131. package/src/pages/home.mpx +52 -52
  132. package/src/pages/home2.mpx +47 -47
  133. package/src/pages/index.mpx +13 -3
  134. package/src/pages/tabbar/home.mpx +77 -77
  135. package/src/pages/tabbar/my.mpx +80 -80
  136. package/src/store/user.ts +270 -270
  137. package/src/styles/index.scss +20 -20
  138. package/src/styles/vars.scss +27 -27
  139. package/src/utils/common.ts +179 -179
  140. package/src/utils/config.ts +35 -35
  141. package/src/utils/db.ts +100 -100
  142. package/src/utils/grpc.ts +21 -21
  143. package/src/utils/net.ts +18 -18
  144. package/src/utils/request.ts +134 -134
  145. package/static/ali/mini.project.json +4 -4
  146. package/static/dd/project.config.json +15 -15
  147. package/static/swan/project.swan.json +14 -14
  148. package/static/tt/project.config.json +11 -11
  149. package/static/wx/project.config.json +40 -40
  150. package/uno.config.js +9 -9
@@ -1,389 +1,389 @@
1
- <template>
2
- <!-- Web端账号登录弹窗 -->
3
- <cube-modal wx:ref="loginModal" visible="{{ isVisible }}" noBuiltInBtns="true" maskClosable="false" z-index="999"
4
- bind:cancel="onClose" mask-opacity="0.1" class="login-popup">
5
- <!-- 标题区域 -->
6
- <view class="popup-header" slot="header">
7
- <view class="header-info">
8
- <h2 class="header-title">账号登录</h2>
9
- </view>
10
- <view class="header-close" bind:tap="onClose">
11
- <text class="close-icon">×</text>
12
- </view>
13
- </view>
14
-
15
- <!-- 内容区域 -->
16
- <view class="popup-body" slot="content">
17
- <!-- 用户名输入 -->
18
- <view class="form-item">
19
- <view class="form-label">用户名</view>
20
- <input type="text" class="form-input" placeholder="请输入用户名" bind:input="onUsernameInput"
21
- value="{{ username }}" />
22
- </view>
23
-
24
- <!-- 密码输入 -->
25
- <view class="form-item">
26
- <view class="form-label">密码</view>
27
- <input type="password" class="form-input" placeholder="请输入密码" bind:input="onPasswordInput"
28
- value="{{ password }}" />
29
- </view>
30
-
31
- <!-- 协议勾选 -->
32
- <view class="agreement-row">
33
- <cube-checkbox value="{{ agreed }}" bind:input="onAgreeChange" shape="square" class="agreement-check">
34
- <text class="agreement-text">已阅读并同意</text>
35
- <text id="user" class="agreement-link" bind:tap="goInfo">《用户使用协议》</text>
36
- <text class="agreement-text">和</text>
37
- <text id="privacy" class="agreement-link" bind:tap="goInfo">《隐私权政策》</text>
38
- </cube-checkbox>
39
- </view>
40
-
41
- <!-- 操作按钮区 -->
42
- <view class="action-area">
43
- <button class="btn-login" bind:tap="handleLogin" disabled="{{ !canLogin }}">
44
- 登录
45
- </button>
46
- <button class="btn-register" bind:tap="handleRegister">
47
- 新用户注册
48
- </button>
49
- <view class="btn-cancel" bind:tap="onClose">
50
- <text class="cancel-text">暂时不登录</text>
51
- </view>
52
- </view>
53
- </view>
54
- </cube-modal>
55
- </template>
56
-
57
- <script>
58
- import mpx, { createComponent, ref, watch, toRefs, computed } from '@mpxjs/core'
59
- import { useUserStore } from '../../store/user'
60
-
61
- createComponent({
62
- properties: {
63
- visible: {
64
- type: Boolean,
65
- value: false
66
- }
67
- },
68
- setup(props) {
69
- const userStore = useUserStore()
70
- // 表单数据
71
- const username = ref('')
72
- const password = ref('')
73
- const agreed = ref(false)
74
- const isVisible = ref(props.visible)
75
-
76
- const { visible } = toRefs(props)
77
- watch(visible, (newVal) => {
78
- isVisible.value = newVal
79
- if (newVal) {
80
- // 打开弹窗重置表单
81
- username.value = ''
82
- password.value = ''
83
- agreed.value = false
84
- }
85
- })
86
-
87
- // 登录按钮是否可点击计算属性
88
- const canLogin = computed(() => {
89
- return username.value.trim() && password.value.trim() && agreed.value
90
- })
91
-
92
- return {
93
- username,
94
- password,
95
- agreed,
96
- isVisible,
97
- canLogin,
98
- userStore
99
- }
100
- },
101
- methods: {
102
- // 关闭弹窗
103
- onClose() {
104
- this.isVisible = false
105
- this.triggerEvent('close', false)
106
- },
107
-
108
- // 用户名输入
109
- onUsernameInput(e) {
110
- this.username = e.detail.value
111
- },
112
-
113
- // 密码输入
114
- onPasswordInput(e) {
115
- this.password = e.detail.value
116
- },
117
-
118
- // 协议勾选变化
119
- onAgreeChange(e) {
120
- this.agreed = e.detail.value
121
- },
122
-
123
- // 登录逻辑
124
- handleLogin() {
125
- if (!this.canLogin) return
126
-
127
- // 表单校验
128
- if (!this.username.trim()) {
129
- return mpx.showToast({ title: '请输入用户名', icon: 'none', duration: 2000 })
130
- }
131
- if (!this.password.trim()) {
132
- return mpx.showToast({ title: '请输入密码', icon: 'none', duration: 2000 })
133
- }
134
- if (!this.agreed) {
135
- return mpx.showToast({ title: '请阅读并同意用户协议', icon: 'none', duration: 2000 })
136
- }
137
-
138
- mpx.showLoading({ title: '登录中...', mask: true })
139
- // 调用store登录方法
140
- let that = this;
141
- this.userStore.webLogin(
142
- this.username.trim(), this.password.trim()
143
- ).then(res => {
144
- mpx.hideLoading()
145
- if (res.status) {
146
- mpx.showToast({ title: '登录成功', icon: 'success', duration: 1500 })
147
- // 触发登录成功事件
148
- that.triggerEvent('loginSuccess', res.data)
149
- // 关闭弹窗
150
- setTimeout(() => {
151
- that.onClose()
152
- }, 1500)
153
- } else {
154
- mpx.showToast({ title: res.message || '登录失败,请重试', icon: 'error', duration: 2000 })
155
- }
156
- }).catch((err) => {
157
- mpx.hideLoading()
158
- console.error('登录失败:', err)
159
- mpx.showToast({ title: '登录失败,请检查网络', icon: 'error', duration: 2000 })
160
- })
161
- },
162
-
163
- // 注册跳转
164
- handleRegister() {
165
- // 触发注册事件,父组件处理跳转逻辑
166
- this.triggerEvent('toRegister')
167
- },
168
-
169
- // 跳转协议页面
170
- goInfo(e) {
171
- const id = e.currentTarget?.id;
172
- this.triggerEvent("policy", id);
173
- mpx.navigateTo({
174
- url: '/jmash/pages/auth/cms-protocol?channelAlias=' + id
175
- });
176
- }
177
- }
178
- })
179
- </script>
180
-
181
- <style lang="scss">
182
- $primary: #1677ff; // Web端主色调蓝色
183
- $primary-dark: #0958d9;
184
- $text-1: #111111;
185
- $text-2: #555555;
186
- $text-3: #888888;
187
- $border: #d9d9d9;
188
- $border-hover: #4096ff;
189
- $bg-page: #f5f5f5;
190
- $bg-card: #ffffff;
191
- $bg-disabled: #f5f5f5;
192
- $text-disabled: #999999;
193
-
194
- .login-popup {
195
- width: 420px;
196
- background-color: $bg-card !important;
197
- border-radius: 8px !important;
198
- overflow: hidden;
199
- }
200
-
201
- .popup-header {
202
- display: flex;
203
- align-items: center;
204
- justify-content: space-between;
205
- padding: 20px 24px 16px;
206
- background: $bg-card;
207
- border-bottom: 1px solid $border;
208
-
209
- .header-info {
210
- flex: 1;
211
-
212
- .header-title {
213
- font-size: 18px;
214
- font-weight: 600;
215
- color: $text-1;
216
- margin: 0;
217
- line-height: 1.5;
218
- }
219
- }
220
-
221
- .header-close {
222
- width: 28px;
223
- height: 28px;
224
- display: flex;
225
- align-items: center;
226
- justify-content: center;
227
- background: transparent;
228
- border-radius: 4px;
229
- cursor: pointer;
230
- transition: background 0.2s;
231
-
232
- &:hover {
233
- background: $bg-page;
234
- }
235
-
236
- .close-icon {
237
- font-size: 20px;
238
- color: $text-3;
239
- line-height: 1;
240
- }
241
- }
242
- }
243
-
244
- .popup-body {
245
- padding: 24px;
246
- background: $bg-card;
247
- }
248
-
249
- /* 表单通用样式 */
250
- .form-item {
251
- margin-bottom: 20px;
252
-
253
- .form-label {
254
- font-size: 14px;
255
- color: $text-1;
256
- margin-bottom: 8px;
257
- line-height: 1.5;
258
- }
259
-
260
- .form-input {
261
- width: 100%;
262
- height: 40px;
263
- padding: 8px 12px;
264
- font-size: 14px;
265
- border: 1px solid $border;
266
- border-radius: 6px;
267
- outline: none;
268
- transition: border-color 0.2s, box-shadow 0.2s;
269
- box-sizing: border-box;
270
-
271
- &:focus {
272
- border-color: $border-hover;
273
- box-shadow: 0 0 0 2px rgba(22, 119, 255, 0.1);
274
- }
275
-
276
- &::placeholder {
277
- color: $text-3;
278
- }
279
- }
280
- }
281
-
282
- .agreement-row {
283
- margin-bottom: 24px;
284
-
285
- .agreement-check {
286
- font-size: 13px;
287
- cursor: pointer;
288
-
289
- .agreement-text {
290
- color: $text-2;
291
- font-size: 13px;
292
- }
293
-
294
- .agreement-link {
295
- color: $primary;
296
- font-size: 13px;
297
- cursor: pointer;
298
- transition: color 0.2s;
299
-
300
- &:hover {
301
- color: $primary-dark;
302
- text-decoration: underline;
303
- }
304
- }
305
- }
306
- }
307
-
308
- .action-area {
309
- display: flex;
310
- flex-direction: column;
311
- gap: 16px;
312
-
313
- .btn-login {
314
- width: 100%;
315
- height: 42px;
316
- border-radius: 6px;
317
- font-size: 15px;
318
- font-weight: 500;
319
- background-color: $primary;
320
- color: #fff;
321
- border: none;
322
- cursor: pointer;
323
- transition: background-color 0.2s;
324
-
325
- &:hover {
326
- background-color: $primary-dark;
327
- }
328
-
329
- &:disabled {
330
- background-color: $bg-disabled;
331
- color: $text-disabled;
332
- cursor: not-allowed;
333
- }
334
- }
335
-
336
- .btn-register {
337
- width: 100%;
338
- height: 42px;
339
- border-radius: 6px;
340
- font-size: 15px;
341
- font-weight: 500;
342
- background-color: #fff;
343
- color: $primary;
344
- border: 1px solid $primary;
345
- cursor: pointer;
346
- transition: background-color 0.2s;
347
-
348
- &:hover {
349
- background-color: rgba(22, 119, 255, 0.04);
350
- }
351
- }
352
-
353
- .btn-cancel {
354
- text-align: center;
355
- padding: 8px 0;
356
- cursor: pointer;
357
-
358
- .cancel-text {
359
- font-size: 14px;
360
- color: $text-3;
361
- transition: color 0.2s;
362
-
363
- &:hover {
364
- color: $text-2;
365
- }
366
- }
367
- }
368
- }
369
-
370
- /* cube-ui组件样式调整 */
371
- :deep(.cube-checkbox__input) {
372
- margin-right: 8px;
373
- }
374
-
375
- :deep(.cube-checkbox__content) {
376
- line-height: 1.5;
377
- }
378
- </style>
379
-
380
- <script type="application/json">
381
- {
382
- "component": true,
383
- "usingComponents": {
384
- "cube-modal": "@mpxjs/mpx-cube-ui/lib/components/modal/index.mpx",
385
- "cube-checkbox": "@mpxjs/mpx-cube-ui/lib/components/checkbox/index.mpx",
386
- "cube-checkbox-group": "@mpxjs/mpx-cube-ui/lib/components/checkbox-group/index.mpx"
387
- }
388
- }
389
- </script>
1
+ <template>
2
+ <!-- Web端账号登录弹窗 -->
3
+ <cube-modal wx:ref="loginModal" visible="{{ isVisible }}" noBuiltInBtns="true" maskClosable="false" z-index="999"
4
+ bind:cancel="onClose" mask-opacity="0.1" class="login-popup">
5
+ <!-- 标题区域 -->
6
+ <view class="popup-header" slot="header">
7
+ <view class="header-info">
8
+ <h2 class="header-title">账号登录</h2>
9
+ </view>
10
+ <view class="header-close" bind:tap="onClose">
11
+ <text class="close-icon">×</text>
12
+ </view>
13
+ </view>
14
+
15
+ <!-- 内容区域 -->
16
+ <view class="popup-body" slot="content">
17
+ <!-- 用户名输入 -->
18
+ <view class="form-item">
19
+ <view class="form-label">用户名</view>
20
+ <input type="text" class="form-input" placeholder="请输入用户名" bind:input="onUsernameInput"
21
+ value="{{ username }}" />
22
+ </view>
23
+
24
+ <!-- 密码输入 -->
25
+ <view class="form-item">
26
+ <view class="form-label">密码</view>
27
+ <input type="password" class="form-input" placeholder="请输入密码" bind:input="onPasswordInput"
28
+ value="{{ password }}" />
29
+ </view>
30
+
31
+ <!-- 协议勾选 -->
32
+ <view class="agreement-row">
33
+ <cube-checkbox value="{{ agreed }}" bind:input="onAgreeChange" shape="square" class="agreement-check">
34
+ <text class="agreement-text">已阅读并同意</text>
35
+ <text id="user" class="agreement-link" bind:tap="goInfo">《用户使用协议》</text>
36
+ <text class="agreement-text">和</text>
37
+ <text id="privacy" class="agreement-link" bind:tap="goInfo">《隐私权政策》</text>
38
+ </cube-checkbox>
39
+ </view>
40
+
41
+ <!-- 操作按钮区 -->
42
+ <view class="action-area">
43
+ <button class="btn-login" bind:tap="handleLogin" disabled="{{ !canLogin }}">
44
+ 登录
45
+ </button>
46
+ <button class="btn-register" bind:tap="handleRegister">
47
+ 新用户注册
48
+ </button>
49
+ <view class="btn-cancel" bind:tap="onClose">
50
+ <text class="cancel-text">暂时不登录</text>
51
+ </view>
52
+ </view>
53
+ </view>
54
+ </cube-modal>
55
+ </template>
56
+
57
+ <script>
58
+ import mpx, { createComponent, ref, watch, toRefs, computed } from '@mpxjs/core'
59
+ import { useUserStore } from '../../store/user'
60
+
61
+ createComponent({
62
+ properties: {
63
+ visible: {
64
+ type: Boolean,
65
+ value: false
66
+ }
67
+ },
68
+ setup(props) {
69
+ const userStore = useUserStore()
70
+ // 表单数据
71
+ const username = ref('')
72
+ const password = ref('')
73
+ const agreed = ref(false)
74
+ const isVisible = ref(props.visible)
75
+
76
+ const { visible } = toRefs(props)
77
+ watch(visible, (newVal) => {
78
+ isVisible.value = newVal
79
+ if (newVal) {
80
+ // 打开弹窗重置表单
81
+ username.value = ''
82
+ password.value = ''
83
+ agreed.value = false
84
+ }
85
+ })
86
+
87
+ // 登录按钮是否可点击计算属性
88
+ const canLogin = computed(() => {
89
+ return username.value.trim() && password.value.trim() && agreed.value
90
+ })
91
+
92
+ return {
93
+ username,
94
+ password,
95
+ agreed,
96
+ isVisible,
97
+ canLogin,
98
+ userStore
99
+ }
100
+ },
101
+ methods: {
102
+ // 关闭弹窗
103
+ onClose() {
104
+ this.isVisible = false
105
+ this.triggerEvent('close', false)
106
+ },
107
+
108
+ // 用户名输入
109
+ onUsernameInput(e) {
110
+ this.username = e.detail.value
111
+ },
112
+
113
+ // 密码输入
114
+ onPasswordInput(e) {
115
+ this.password = e.detail.value
116
+ },
117
+
118
+ // 协议勾选变化
119
+ onAgreeChange(e) {
120
+ this.agreed = e.detail.value
121
+ },
122
+
123
+ // 登录逻辑
124
+ handleLogin() {
125
+ if (!this.canLogin) return
126
+
127
+ // 表单校验
128
+ if (!this.username.trim()) {
129
+ return mpx.showToast({ title: '请输入用户名', icon: 'none', duration: 2000 })
130
+ }
131
+ if (!this.password.trim()) {
132
+ return mpx.showToast({ title: '请输入密码', icon: 'none', duration: 2000 })
133
+ }
134
+ if (!this.agreed) {
135
+ return mpx.showToast({ title: '请阅读并同意用户协议', icon: 'none', duration: 2000 })
136
+ }
137
+
138
+ mpx.showLoading({ title: '登录中...', mask: true })
139
+ // 调用store登录方法
140
+ let that = this;
141
+ this.userStore.webLogin(
142
+ this.username.trim(), this.password.trim()
143
+ ).then(res => {
144
+ mpx.hideLoading()
145
+ if (res.status) {
146
+ mpx.showToast({ title: '登录成功', icon: 'success', duration: 1500 })
147
+ // 触发登录成功事件
148
+ that.triggerEvent('loginSuccess', res.data)
149
+ // 关闭弹窗
150
+ setTimeout(() => {
151
+ that.onClose()
152
+ }, 1500)
153
+ } else {
154
+ mpx.showToast({ title: res.message || '登录失败,请重试', icon: 'error', duration: 2000 })
155
+ }
156
+ }).catch((err) => {
157
+ mpx.hideLoading()
158
+ console.error('登录失败:', err)
159
+ mpx.showToast({ title: '登录失败,请检查网络', icon: 'error', duration: 2000 })
160
+ })
161
+ },
162
+
163
+ // 注册跳转
164
+ handleRegister() {
165
+ // 触发注册事件,父组件处理跳转逻辑
166
+ this.triggerEvent('toRegister')
167
+ },
168
+
169
+ // 跳转协议页面
170
+ goInfo(e) {
171
+ const id = e.currentTarget?.id;
172
+ this.triggerEvent("policy", id);
173
+ mpx.navigateTo({
174
+ url: '/jmash/pages/auth/cms-protocol?channelAlias=' + id
175
+ });
176
+ }
177
+ }
178
+ })
179
+ </script>
180
+
181
+ <style lang="scss">
182
+ $primary: #1677ff; // Web端主色调蓝色
183
+ $primary-dark: #0958d9;
184
+ $text-1: #111111;
185
+ $text-2: #555555;
186
+ $text-3: #888888;
187
+ $border: #d9d9d9;
188
+ $border-hover: #4096ff;
189
+ $bg-page: #f5f5f5;
190
+ $bg-card: #ffffff;
191
+ $bg-disabled: #f5f5f5;
192
+ $text-disabled: #999999;
193
+
194
+ .login-popup {
195
+ width: 420px;
196
+ background-color: $bg-card !important;
197
+ border-radius: 8px !important;
198
+ overflow: hidden;
199
+ }
200
+
201
+ .popup-header {
202
+ display: flex;
203
+ align-items: center;
204
+ justify-content: space-between;
205
+ padding: 20px 24px 16px;
206
+ background: $bg-card;
207
+ border-bottom: 1px solid $border;
208
+
209
+ .header-info {
210
+ flex: 1;
211
+
212
+ .header-title {
213
+ font-size: 18px;
214
+ font-weight: 600;
215
+ color: $text-1;
216
+ margin: 0;
217
+ line-height: 1.5;
218
+ }
219
+ }
220
+
221
+ .header-close {
222
+ width: 28px;
223
+ height: 28px;
224
+ display: flex;
225
+ align-items: center;
226
+ justify-content: center;
227
+ background: transparent;
228
+ border-radius: 4px;
229
+ cursor: pointer;
230
+ transition: background 0.2s;
231
+
232
+ &:hover {
233
+ background: $bg-page;
234
+ }
235
+
236
+ .close-icon {
237
+ font-size: 20px;
238
+ color: $text-3;
239
+ line-height: 1;
240
+ }
241
+ }
242
+ }
243
+
244
+ .popup-body {
245
+ padding: 24px;
246
+ background: $bg-card;
247
+ }
248
+
249
+ /* 表单通用样式 */
250
+ .form-item {
251
+ margin-bottom: 20px;
252
+
253
+ .form-label {
254
+ font-size: 14px;
255
+ color: $text-1;
256
+ margin-bottom: 8px;
257
+ line-height: 1.5;
258
+ }
259
+
260
+ .form-input {
261
+ width: 100%;
262
+ height: 40px;
263
+ padding: 8px 12px;
264
+ font-size: 14px;
265
+ border: 1px solid $border;
266
+ border-radius: 6px;
267
+ outline: none;
268
+ transition: border-color 0.2s, box-shadow 0.2s;
269
+ box-sizing: border-box;
270
+
271
+ &:focus {
272
+ border-color: $border-hover;
273
+ box-shadow: 0 0 0 2px rgba(22, 119, 255, 0.1);
274
+ }
275
+
276
+ &::placeholder {
277
+ color: $text-3;
278
+ }
279
+ }
280
+ }
281
+
282
+ .agreement-row {
283
+ margin-bottom: 24px;
284
+
285
+ .agreement-check {
286
+ font-size: 13px;
287
+ cursor: pointer;
288
+
289
+ .agreement-text {
290
+ color: $text-2;
291
+ font-size: 13px;
292
+ }
293
+
294
+ .agreement-link {
295
+ color: $primary;
296
+ font-size: 13px;
297
+ cursor: pointer;
298
+ transition: color 0.2s;
299
+
300
+ &:hover {
301
+ color: $primary-dark;
302
+ text-decoration: underline;
303
+ }
304
+ }
305
+ }
306
+ }
307
+
308
+ .action-area {
309
+ display: flex;
310
+ flex-direction: column;
311
+ gap: 16px;
312
+
313
+ .btn-login {
314
+ width: 100%;
315
+ height: 42px;
316
+ border-radius: 6px;
317
+ font-size: 15px;
318
+ font-weight: 500;
319
+ background-color: $primary;
320
+ color: #fff;
321
+ border: none;
322
+ cursor: pointer;
323
+ transition: background-color 0.2s;
324
+
325
+ &:hover {
326
+ background-color: $primary-dark;
327
+ }
328
+
329
+ &:disabled {
330
+ background-color: $bg-disabled;
331
+ color: $text-disabled;
332
+ cursor: not-allowed;
333
+ }
334
+ }
335
+
336
+ .btn-register {
337
+ width: 100%;
338
+ height: 42px;
339
+ border-radius: 6px;
340
+ font-size: 15px;
341
+ font-weight: 500;
342
+ background-color: #fff;
343
+ color: $primary;
344
+ border: 1px solid $primary;
345
+ cursor: pointer;
346
+ transition: background-color 0.2s;
347
+
348
+ &:hover {
349
+ background-color: rgba(22, 119, 255, 0.04);
350
+ }
351
+ }
352
+
353
+ .btn-cancel {
354
+ text-align: center;
355
+ padding: 8px 0;
356
+ cursor: pointer;
357
+
358
+ .cancel-text {
359
+ font-size: 14px;
360
+ color: $text-3;
361
+ transition: color 0.2s;
362
+
363
+ &:hover {
364
+ color: $text-2;
365
+ }
366
+ }
367
+ }
368
+ }
369
+
370
+ /* cube-ui组件样式调整 */
371
+ :deep(.cube-checkbox__input) {
372
+ margin-right: 8px;
373
+ }
374
+
375
+ :deep(.cube-checkbox__content) {
376
+ line-height: 1.5;
377
+ }
378
+ </style>
379
+
380
+ <script type="application/json">
381
+ {
382
+ "component": true,
383
+ "usingComponents": {
384
+ "cube-modal": "@mpxjs/mpx-cube-ui/lib/components/modal/index.mpx",
385
+ "cube-checkbox": "@mpxjs/mpx-cube-ui/lib/components/checkbox/index.mpx",
386
+ "cube-checkbox-group": "@mpxjs/mpx-cube-ui/lib/components/checkbox-group/index.mpx"
387
+ }
388
+ }
389
+ </script>