Compare commits
12
Commits
v0.9.0
...
dea414739e
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dea414739e | ||
|
|
d13bdd5dc8 | ||
|
|
040ec3f382 | ||
|
|
9a58b98f12 | ||
|
|
e2618735ba | ||
|
|
b68361b037 | ||
|
|
d846d2d864 | ||
|
|
e6d1d6997b | ||
|
|
ada3b56d14 | ||
|
|
7e8ae86d9f | ||
|
|
430ba59613 | ||
|
|
e9a956f16c |
No files matched your search
@@ -0,0 +1,28 @@
|
||||
# Author: fruit.com.cn
|
||||
# ReelShortWeb 后台 CI:lint + 构建门禁
|
||||
name: web-ci
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [develop, main]
|
||||
pull_request:
|
||||
branches: [develop, main]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: pnpm/action-setup@v4
|
||||
with:
|
||||
version: 9
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: "20"
|
||||
cache: pnpm
|
||||
- name: 依赖
|
||||
run: pnpm install --frozen-lockfile
|
||||
- name: 类型检查
|
||||
run: pnpm ts:check
|
||||
- name: 构建
|
||||
run: pnpm build:pro
|
||||
@@ -24,6 +24,7 @@
|
||||
"prepare": "husky install"
|
||||
},
|
||||
"dependencies": {
|
||||
"@element-plus/icons-vue": "2.3.2",
|
||||
"@iconify/iconify": "^3.1.1",
|
||||
"@iconify/vue": "^4.1.1",
|
||||
"@vueuse/core": "^10.7.2",
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
export type UserLoginType = {
|
||||
username: string
|
||||
password?: string
|
||||
}
|
||||
|
||||
export type UserType = {
|
||||
|
||||
@@ -87,8 +87,8 @@ export const useUserStore = defineStore('user', {
|
||||
this.setToken('')
|
||||
this.setUserInfo(undefined)
|
||||
this.setRoleRouters([])
|
||||
this.setLoginInfo(undefined)
|
||||
this.setRememberMe(false)
|
||||
// 注意:不能清 loginInfo / rememberMe —— 那是「记住我」存的账号密码,
|
||||
// 退出登录后回到登录页还要靠它来回填,清了就等于「记住我」没生效。
|
||||
tagsViewStore.delAllViews()
|
||||
// 菜单/路由一起清:否则换账号后 permissionStore 里还是上一个账号的路由表
|
||||
permissionStore.clearRoutes()
|
||||
@@ -104,17 +104,7 @@ export const useUserStore = defineStore('user', {
|
||||
this.loginInfo = loginInfo
|
||||
}
|
||||
},
|
||||
persist: {
|
||||
afterRestore: (context) => {
|
||||
const loginInfo = context.store.loginInfo as
|
||||
(UserLoginType & { password?: string }) | undefined
|
||||
if (loginInfo?.password !== undefined) {
|
||||
context.store.setLoginInfo(
|
||||
loginInfo.username ? { username: loginInfo.username } : undefined
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
persist: true
|
||||
})
|
||||
|
||||
export const useUserStoreWithOut = () => {
|
||||
|
||||
@@ -132,7 +132,7 @@ const remember = ref(userStore.getRememberMe)
|
||||
const initLoginInfo = () => {
|
||||
const loginInfo = userStore.getLoginInfo
|
||||
if (loginInfo) {
|
||||
setValues({ username: loginInfo.username })
|
||||
setValues({ username: loginInfo.username, password: loginInfo.password })
|
||||
}
|
||||
}
|
||||
onMounted(() => {
|
||||
@@ -169,10 +169,12 @@ const signIn = async () => {
|
||||
const res = await loginApi(formData)
|
||||
|
||||
if (res) {
|
||||
// 是否记住我
|
||||
// 是否记住我:勾选时把账号密码一起持久化到 localStorage,
|
||||
// 下次打开登录页自动回填,免重复输入。
|
||||
if (unref(remember)) {
|
||||
userStore.setLoginInfo({
|
||||
username: formData.username
|
||||
username: formData.username,
|
||||
password: formData.password
|
||||
})
|
||||
} else {
|
||||
userStore.setLoginInfo(undefined)
|
||||
|
||||
@@ -33,6 +33,7 @@ const DEFAULT_TAG_COLOR = '#E5484D'
|
||||
const emptyForm = () => ({
|
||||
locales: { zh: '' },
|
||||
bgColor: DEFAULT_TAG_COLOR,
|
||||
code: '',
|
||||
sort: 1,
|
||||
status: 1
|
||||
})
|
||||
@@ -66,6 +67,7 @@ function openEdit(row) {
|
||||
Object.assign(form, {
|
||||
locales,
|
||||
bgColor: row.bgColor || DEFAULT_TAG_COLOR,
|
||||
code: row.code || '',
|
||||
sort: row.sort ?? 0,
|
||||
status: row.status ?? 1
|
||||
})
|
||||
@@ -83,12 +85,18 @@ async function save() {
|
||||
ElMessage.warning(`请填写${languageLabel(missing)}名称`)
|
||||
return
|
||||
}
|
||||
const code = (form.code || '').trim().toUpperCase()
|
||||
if (code && !/^[A-Z][A-Z0-9_]{0,31}$/.test(code)) {
|
||||
ElMessage.warning('语义码需为大写字母、数字或下划线,且以字母开头')
|
||||
return
|
||||
}
|
||||
saving.value = true
|
||||
try {
|
||||
const payload = {
|
||||
name: locales.zh,
|
||||
locales,
|
||||
bgColor: form.bgColor || DEFAULT_TAG_COLOR,
|
||||
code,
|
||||
sort: form.sort,
|
||||
status: form.status
|
||||
}
|
||||
@@ -209,6 +217,16 @@ onMounted(load)
|
||||
<el-form-item label="背景色">
|
||||
<el-color-picker v-model="form.bgColor" color-format="hex" />
|
||||
</el-form-item>
|
||||
<el-form-item label="语义码">
|
||||
<el-input
|
||||
v-model="form.code"
|
||||
maxlength="32"
|
||||
placeholder="如 NEW_ARRIVAL,留空则按名称匹配"
|
||||
/>
|
||||
<div class="form-hint">
|
||||
客户端按语义码判断板块(如「上新」横滑),改名或换语言都不受影响。
|
||||
</div>
|
||||
</el-form-item>
|
||||
<div class="form-row">
|
||||
<el-form-item label="排序">
|
||||
<el-input-number v-model="form.sort" :min="0" :max="999" />
|
||||
@@ -236,4 +254,11 @@ onMounted(load)
|
||||
height: 16px;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.form-hint {
|
||||
margin-top: 4px;
|
||||
font-size: 12px;
|
||||
line-height: 1.5;
|
||||
color: var(--el-text-color-secondary);
|
||||
}
|
||||
</style>
|
||||
@@ -326,17 +326,17 @@ function onEpisodesCreated(): void {
|
||||
|
||||
.batch-upload-hint {
|
||||
margin: 0 0 12px;
|
||||
color: var(--el-text-color-secondary);
|
||||
font-size: 13px;
|
||||
color: var(--el-text-color-secondary);
|
||||
}
|
||||
|
||||
.batch-upload-rejected {
|
||||
margin-bottom: 12px;
|
||||
padding: 8px 12px;
|
||||
border-radius: 6px;
|
||||
background: color-mix(in srgb, var(--el-color-danger) 8%, transparent);
|
||||
color: var(--el-color-danger);
|
||||
margin-bottom: 12px;
|
||||
font-size: 12px;
|
||||
color: var(--el-color-danger);
|
||||
background: color-mix(in srgb, var(--el-color-danger) 8%, transparent);
|
||||
border-radius: 6px;
|
||||
}
|
||||
|
||||
.batch-upload-rejected p {
|
||||
@@ -348,12 +348,12 @@ function onEpisodesCreated(): void {
|
||||
}
|
||||
|
||||
.batch-upload-summary {
|
||||
margin: 0 0 12px;
|
||||
padding: 8px 12px;
|
||||
border-radius: 6px;
|
||||
background: color-mix(in srgb, var(--el-color-success) 10%, transparent);
|
||||
color: var(--el-text-color-primary);
|
||||
margin: 0 0 12px;
|
||||
font-size: 13px;
|
||||
color: var(--el-text-color-primary);
|
||||
background: color-mix(in srgb, var(--el-color-success) 10%, transparent);
|
||||
border-radius: 6px;
|
||||
}
|
||||
|
||||
.batch-upload-list {
|
||||
|
||||
@@ -202,9 +202,9 @@ function hasFailed(): boolean {
|
||||
<style scoped>
|
||||
.create-episode-hint {
|
||||
margin: 0 0 12px;
|
||||
color: var(--el-text-color-secondary);
|
||||
font-size: 13px;
|
||||
line-height: 1.5;
|
||||
color: var(--el-text-color-secondary);
|
||||
}
|
||||
|
||||
.create-episode-head,
|
||||
@@ -229,8 +229,8 @@ function hasFailed(): boolean {
|
||||
|
||||
.create-episode-head {
|
||||
margin-bottom: 8px;
|
||||
color: var(--el-text-color-secondary);
|
||||
font-size: 12px;
|
||||
color: var(--el-text-color-secondary);
|
||||
}
|
||||
|
||||
.create-episode-list {
|
||||
@@ -253,8 +253,8 @@ function hasFailed(): boolean {
|
||||
}
|
||||
|
||||
.create-episode-result {
|
||||
color: var(--el-text-color-secondary);
|
||||
font-size: 12px;
|
||||
color: var(--el-text-color-secondary);
|
||||
}
|
||||
|
||||
.create-episode-row.is-saved .create-episode-result {
|
||||
|
||||
@@ -100,10 +100,10 @@ const canRetry = computed(() => props.item.status === 'failed')
|
||||
}
|
||||
|
||||
.upload-task-row__index {
|
||||
flex: 0 0 auto;
|
||||
min-width: 1.5em;
|
||||
color: var(--el-text-color-secondary);
|
||||
font-size: 13px;
|
||||
color: var(--el-text-color-secondary);
|
||||
flex: 0 0 auto;
|
||||
font-variant-numeric: tabular-nums;
|
||||
}
|
||||
|
||||
@@ -116,22 +116,22 @@ const canRetry = computed(() => props.item.status === 'failed')
|
||||
|
||||
.upload-task-row__error {
|
||||
margin: 6px 0 0;
|
||||
color: var(--el-color-danger);
|
||||
font-size: 12px;
|
||||
color: var(--el-color-danger);
|
||||
}
|
||||
|
||||
.upload-task-row__actions {
|
||||
margin-top: 8px;
|
||||
display: flex;
|
||||
margin-top: 8px;
|
||||
margin-left: auto;
|
||||
gap: 8px;
|
||||
justify-content: flex-end;
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
.upload-task-row.is-failed {
|
||||
padding-right: 8px;
|
||||
padding-left: 8px;
|
||||
background: color-mix(in srgb, var(--el-color-danger) 6%, transparent);
|
||||
border-radius: 6px;
|
||||
padding-left: 8px;
|
||||
padding-right: 8px;
|
||||
}
|
||||
</style>
|
||||
Reference in new issue
Block a user